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

Artifact 96bda574284ead53ba7af6334414b4e958cc866a:


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: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1ed0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
1ee0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
1ef0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
1f00: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
1f10: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1f20: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
1f30: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
1f40: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
1f50: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
1f60: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
1f70: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
1f80: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1f90: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
1fa0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fb0: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
1fc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fd0: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
1fe0: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
1ff0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
2000: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
2010: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
2020: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
2030: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2040: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2050: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
2060: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
2070: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
2080: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
2090: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
20a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
20b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
20d0: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
20e0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
20f0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2100: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
2110: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
2120: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
2130: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
2140: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
2150: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
2160: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
2170: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2180: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
2190: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
21a0: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
21b0: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
21c0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
21d0: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
21e0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
21f0: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
2200: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
2210: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
2220: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
2230: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2240: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
2250: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
2260: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2270: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
2280: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
2290: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
22a0: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
22b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
22c0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
22d0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
22e0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
22f0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2300: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2310: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
2320: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2330: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2340: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
2350: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
2360: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2370: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
2380: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  lect *p, int *pn
2390: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
23a0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
23b0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
23c0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
23d0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
23e0: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
23f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2400: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
2410: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2420: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f  ightOfExpr(p->pO
2430: 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29  ffset, pnHeight)
2440: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2450: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
2460: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2470: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2480: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
2490: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
24a0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
24b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
24c0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24d0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72  tOfSelect(p->pPr
24e0: 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ior, pnHeight);.
24f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
2500: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2510: 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  t variable in th
2520: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
2530: 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67  ed as an .** arg
2540: 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73  ument. An expres
2550: 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69  sion with no chi
2560: 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73  ldren, Expr.pLis
2570: 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53  t or .** Expr.pS
2580: 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73  elect member has
2590: 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20   a height of 1. 
25a0: 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
25b0: 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65  sion.** has a he
25c0: 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68  ight equal to th
25d0: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
25e0: 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a   of any other .*
25f0: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70  * referenced Exp
2600: 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73  r plus one..*/.s
2610: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53  tatic void exprS
2620: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
2630: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2640: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2650: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
2660: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
2670: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67  htOfExpr(p->pRig
2680: 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ht, &nHeight);. 
2690: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
26a0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
26b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69  lect) ){.    hei
26c0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78  ghtOfSelect(p->x
26d0: 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  .pSelect, &nHeig
26e0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
26f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
2700: 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  st(p->x.pList, &
2710: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
2720: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
2730: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
2740: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2750: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2760: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
2770: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
2780: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
2790: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
27a0: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
27b0: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
27c0: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
27d0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
27e0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
27f0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
2800: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
2810: 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  rse, Expr *p){. 
2820: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
2830: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2840: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
2850: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
2860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2870: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2880: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
2890: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
28a0: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
28b0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
28c0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
28d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
28e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
28f0: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
2900: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2910: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2920: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
2930: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
2940: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20  eight;.}.#else. 
2950: 20 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74   #define exprSet
2960: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
2970: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
2980: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
2990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
29a0: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
29b0: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
29c0: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
29d0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
29e0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
29f0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
2a00: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
2a10: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
2a20: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
2a30: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
2a40: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
2a50: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
2a60: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
2a70: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
2a80: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2a90: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2aa0: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2ab0: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
2ac0: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
2ad0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
2ae0: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
2af0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
2b00: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
2b10: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
2b20: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
2b30: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
2b40: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68  performance.  Th
2b50: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
2b60: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
2b70: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
2b80: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
2b90: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
2ba0: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
2bb0: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
2bc0: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
2bd0: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
2be0: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
2bf0: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
2c00: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
2c10: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
2c20: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
2c30: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
2c40: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
2c50: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
2c60: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
2c70: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
2c80: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
2c90: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
2ca0: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
2cb0: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
2cc0: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
2cd0: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
2ce0: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
2cf0: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
2d00: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
2d10: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
2d20: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
2d30: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
2d40: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
2d50: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
2d60: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
2d70: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
2d80: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2d90: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
2da0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
2db0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
2dc0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
2dd0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
2de0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
2df0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2e00: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
2e10: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
2e20: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
2e30: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
2e40: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
2e50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
2e60: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
2e70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2e80: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
2e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
2ea0: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
2eb0: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
2ec0: 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ..  if( pToken )
2ed0: 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b  {.    if( op!=TK
2ee0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b  _INTEGER || pTok
2ef0: 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  en->z==0.       
2f00: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
2f10: 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c  Int32(pToken->z,
2f20: 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a   &iValue)==0 ){.
2f30: 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70        nExtra = p
2f40: 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20  Token->n+1;.    
2f50: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  }.  }.  pNew = s
2f60: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2f70: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
2f80: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
2f90: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
2fa0: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
2fb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
2fc0: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
2fd0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
2fe0: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
2ff0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
3000: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
3010: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
3020: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
3030: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
3040: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
3050: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
3060: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
3070: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
3080: 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
3090: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
30a0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
30b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
30c0: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
30d0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
30e0: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 6e  if( dequote && n
30f0: 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20 20  Extra>=3 .      
3100: 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d 20         && ((c = 
3110: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27  pToken->z[0])=='
3120: 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c  \'' || c=='"' ||
3130: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60   c=='[' || c=='`
3140: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
3150: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
3160: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
3170: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
3180: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
3190: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
31a0: 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
31b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
31c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
31d0: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
31e0: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
31f0: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
3200: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3210: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
3220: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
3230: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
3240: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
3250: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
3260: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
3270: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3280: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
3290: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
32a0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
32b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
32c0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
32d0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
32e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3300: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
3310: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
3320: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
3330: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
3340: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
3350: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
3360: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
3370: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
3380: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
3390: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
33a0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
33b0: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
33c0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
33d0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
33e0: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
33f0: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
3400: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
3410: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
3420: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
3430: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
3440: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
3450: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
3460: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
3470: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
3480: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
3490: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
34a0: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
34b0: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
34c0: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
34d0: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
34e0: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
34f0: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
3500: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
3510: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
3520: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3530: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
3540: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3550: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
3560: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
3570: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
3580: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
3590: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
35a0: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
35b0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
35c0: 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  {.        pRoot-
35d0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
35e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
35f0: 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20   pRoot->pColl = 
3600: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
3610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3620: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
3630: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
3640: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
3650: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
3660: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   ){.        pRoo
3680: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  t->flags |= EP_E
3690: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
36a0: 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20     pRoot->pColl 
36b0: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
36c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36d0: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
36e0: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
36f0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3700: 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20  Expr node which 
3710: 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73  joins as many as
3720: 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a   two subtrees..*
3730: 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68  *.** One or both
3740: 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73   of the subtrees
3750: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52   can be NULL.  R
3760: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3770: 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78  to the new.** Ex
3780: 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66  pr node.  Or, if
3790: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
37a0: 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65  curs, set pParse
37b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
37c0: 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20  ed,.** free the 
37d0: 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74  subtrees and ret
37e0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70  urn NULL..*/.Exp
37f0: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
3800: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3810: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
3820: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3830: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3850: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
3860: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
3870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3880: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
3890: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
38a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
38b0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
38c0: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
38d0: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
38e0: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
38f0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
3900: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
3910: 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f  rse->db, op, pTo
3920: 6b 65 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ken, 1);.  sqlit
3930: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
3940: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
3950: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
3960: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  t);.  return p;.
3970: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
3980: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
3990: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
39a0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
39b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
39c0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
39d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
39e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
39f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3a00: 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  prAnd(sqlite3 *d
3a10: 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  b, Expr *pLeft, 
3a20: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
3a30: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b   if( pLeft==0 ){
3a40: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67  .    return pRig
3a50: 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ht;.  }else if( 
3a60: 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  pRight==0 ){.   
3a70: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20   return pLeft;. 
3a80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
3a90: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
3aa0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
3ab0: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
3ac0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
3ad0: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
3ae0: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
3af0: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
3b00: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
3b10: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
3b20: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
3b30: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
3b40: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
3b50: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
3b60: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3b70: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
3b80: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
3b90: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
3ba0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
3bb0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
3bc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
3bd0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
3be0: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
3bf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
3c00: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
3c10: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
3c20: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
3c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3c40: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
3c50: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
3c60: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
3c70: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
3c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3c90: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
3ca0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
3cb0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
3cc0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
3cd0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
3ce0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
3cf0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
3d00: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
3d10: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
3d20: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
3d30: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
3d40: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
3d50: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
3d60: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
3d70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
3d80: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
3d90: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
3da0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
3db0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
3dc0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
3dd0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3de0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
3df0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
3e00: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
3e10: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
3e20: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
3e30: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
3e40: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
3e50: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
3e60: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
3e70: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
3e80: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
3e90: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
3ea0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
3eb0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3ec0: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
3ed0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
3ee0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
3ef0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
3f00: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
3f10: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
3f20: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
3f30: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
3f40: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
3f50: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
3f60: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
3f70: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
3f80: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
3f90: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3fa0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
3fb0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
3fc0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
3fd0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
3fe0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
3ff0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4000: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4010: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4020: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
4030: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4040: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
4050: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
4060: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
4070: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
4080: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
4090: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
40a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
40b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
40c0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
40d0: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
40e0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
40f0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4100: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4110: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4120: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
4130: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
4140: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
4150: 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  [0]=='?' ){.    
4160: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
4170: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
4180: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
4190: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
41a0: 0a 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61  .    ** use it a
41b0: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
41c0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  umber */.    int
41d0: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
41e0: 29 26 7a 5b 31 5d 29 3b 0a 20 20 20 20 70 45 78  )&z[1]);.    pEx
41f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
4200: 6e 56 61 72 29 69 3b 0a 20 20 20 20 74 65 73 74  nVar)i;.    test
4210: 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20  case( i==0 );.  
4220: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
4230: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
4240: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
4250: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4260: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
4270: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4280: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
4290: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
42a0: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
42b0: 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69      if( i<1 || i
42c0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
42d0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
42e0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
42f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4300: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
4310: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
4320: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
4330: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
4340: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
4350: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4360: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
4370: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
4380: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
4390: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
43a0: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
43b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
43c0: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
43d0: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
43e0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
43f0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
4400: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
4410: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
4420: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4430: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
4440: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
4450: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
4460: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
4470: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
4480: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
4490: 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33 32 20   int i;.    u32 
44a0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
44b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
44c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
44d0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20  arse->nVarExpr; 
44e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
44f0: 20 2a 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61   *pE = pParse->a
4500: 70 56 61 72 45 78 70 72 5b 69 5d 3b 0a 20 20 20  pVarExpr[i];.   
4510: 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
4520: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65   );.      if( me
4530: 6d 63 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b 65  mcmp(pE->u.zToke
4540: 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 70  n, z, n)==0 && p
4550: 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d 3d  E->u.zToken[n]==
4560: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
4570: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  pr->iColumn = pE
4580: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4590: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
45a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
45b0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
45c0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
45d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
45e0: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
45f0: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 69 66 28  nVar);.      if(
4600: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
4610: 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  r>=pParse->nVarE
4620: 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20  xprAlloc-1 ){.  
4630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4640: 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70  arExprAlloc += p
4650: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
4660: 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20  lloc + 10;.     
4670: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
4680: 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
4690: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
46a0: 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20  locOrFree(.     
46b0: 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20           db,.   
46c0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
46d0: 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20  e->apVarExpr,.  
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
46f0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
4700: 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  c*sizeof(pParse-
4710: 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20  >apVarExpr[0]). 
4720: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
4730: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4740: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
4750: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
4760: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56  ert( pParse->apV
4770: 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  arExpr!=0 );.   
4780: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4790: 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e  arExpr[pParse->n
47a0: 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78  VarExpr++] = pEx
47b0: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
47c0: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
47d0: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
47e0: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
47f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4800: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4810: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
4820: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4830: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
4840: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
4850: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
4860: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
4870: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
4880: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4890: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
48a0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
48b0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
48c0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 45  return;.  if( !E
48d0: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
48e0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
48f0: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
4900: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4910: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
4920: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4930: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
4940: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
4950: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
4960: 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e  Reduced) && (p->
4970: 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c  flags2 & EP2_Mal
4980: 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29  locedToken)!=0 )
4990: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
49a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
49b0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
49c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
49d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
49e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
49f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
4a00: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
4a10: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
4a20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4a30: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4a40: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
4a50: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
4a60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4a70: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
4a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4a90: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4ab0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4ac0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
4ad0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4ae0: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
4af0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
4b00: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
4b10: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
4b20: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
4b30: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
4b40: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
4b50: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
4b60: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
4b70: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
4b80: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
4b90: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
4ba0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
4bb0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
4bc0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
4bd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4be0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
4bf0: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
4c00: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
4c10: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
4c30: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
4c40: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
4c50: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4c60: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
4c70: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
4c80: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
4c90: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
4ca0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
4cb0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
4cc0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
4cd0: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
4ce0: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
4cf0: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
4d00: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
4d10: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
4d20: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
4d30: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
4d40: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
4d50: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
4d60: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
4d70: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
4d80: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
4d90: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
4da0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
4db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4df0: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
4e00: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
4e10: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
4e20: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
4e30: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
4e40: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
4e50: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
4e60: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
4e70: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
4e80: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
4e90: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
4ea0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
4eb0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
4ec0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
4ed0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
4ee0: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
4ef0: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
4f00: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
4f10: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
4f20: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
4f30: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
4f40: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
4f50: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
4f60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
4f70: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
4f80: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
4f90: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
4fa0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
4fb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
4fc0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
4fd0: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
4fe0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
4ff0: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
5000: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
5010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
5020: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
5030: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
5040: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
5050: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
5060: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
5070: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
5080: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
5090: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
50a0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
50b0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
50c0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
50d0: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
50e0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
50f0: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
5100: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
5110: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
5120: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
5130: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5140: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
5150: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
5160: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
5170: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
5180: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
5190: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
51a0: 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52 45  ake a EXPRDUP_RE
51b0: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
51c0: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
51d0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
51e0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
51f0: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
5200: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
5210: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
5220: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
5230: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
5240: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
5250: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
5260: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
5270: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
5280: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
5290: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
52a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
52b0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
52c0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
52d0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
52e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
52f0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
5300: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
5310: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
5320: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
5330: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c   */.  if( 0==(fl
5340: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5350: 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  CE) ){.    nSize
5360: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
5370: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
5380: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
5390: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
53a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
53b0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
53c0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
53d0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
53e0: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
53f0: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
5400: 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64  2 & EP2_Malloced
5410: 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20  Token)==0 );.   
5420: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
5430: 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64 75  gs2 & EP2_Irredu
5440: 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20  cible)==0 );.   
5450: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
5460: 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d   p->pRight || p-
5470: 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70  >pColl || p->x.p
5480: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
5490: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
54a0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
54b0: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
54c0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
54d0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
54e0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
54f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5500: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
5510: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5520: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
5530: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
5540: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
5550: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
5560: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5570: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
5580: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
5590: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
55a0: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
55b0: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
55c0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
55d0: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
55e0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
55f0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
5600: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5610: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
5620: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
5630: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5640: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
5650: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
5660: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
5670: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
5680: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
5690: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
56a0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
56b0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
56c0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
56d0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
56e0: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
56f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
5700: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5710: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
5720: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5730: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
5740: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
5750: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
5760: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5770: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
5780: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
5790: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
57a0: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
57b0: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
57c0: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
57d0: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
57e0: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
57f0: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
5800: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
5810: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
5820: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
5830: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
5840: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
5850: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
5860: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
5870: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
5880: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
5890: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
58a0: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
58b0: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
58c0: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
58d0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
58e0: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
58f0: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
5900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
5910: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
5920: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
5930: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
5940: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5950: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
5960: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
5970: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
5980: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5990: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
59a0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
59b0: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
59c0: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
59d0: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
59e0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
59f0: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
5a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5a10: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
5a20: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
5a30: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
5a40: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
5a50: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
5a60: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
5a70: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
5a80: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
5a90: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
5aa0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5ab0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
5ac0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
5ad0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
5ae0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
5af0: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
5b00: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
5b10: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
5b20: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
5b30: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
5b40: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
5b50: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
5b60: 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64  irst byte passed
5b70: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
5b80: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
5b90: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
5ba0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
5bb0: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
5bc0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5bd0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
5be0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
5bf0: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
5c00: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
5c20: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
5c30: 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  /.  if( p ){.   
5c40: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64   const int isRed
5c50: 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58  uced = (flags&EX
5c60: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
5c70: 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20     u8 *zAlloc;. 
5c80: 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61     u32 staticFla
5c90: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  g = 0;..    asse
5ca0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
5cb0: 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a  || isReduced );.
5cc0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
5cd0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
5ce0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
5cf0: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
5d00: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
5d10: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
5d20: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20  *pzBuffer;.     
5d30: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
5d40: 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c  _Static;.    }el
5d50: 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63  se{.      zAlloc
5d60: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5d70: 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45  ocRaw(db, dupedE
5d80: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
5d90: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
5da0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
5db0: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
5dc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
5dd0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
5de0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
5df0: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
5e00: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
5e10: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
5e20: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
5e30: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
5e40: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5e50: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
5e60: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
5e70: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
5e80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5e90: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
5ea0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
5eb0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
5ec0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
5ed0: 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
5ee0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
5ef0: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
5f00: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
5f10: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
5f20: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
5f30: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
5f40: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
5f50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ;.      int nTok
5f60: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  en;.      if( !E
5f70: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5f80: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
5f90: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
5fa0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
5fb0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5fc0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
5fd0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
5fe0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
5ff0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6000: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
6010: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6020: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
6030: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
6040: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
6050: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
6060: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
6070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6080: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65     int nSize = e
6090: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
60a0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
60b0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
60c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
60d0: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
60e0: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
60f0: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
6100: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
6110: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
6120: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
6130: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
6140: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
6150: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  y. */.      pNew
6160: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
6170: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6180: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b  Only|EP_Static);
6190: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
61a0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
61b0: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
61c0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
61d0: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
61e0: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
61f0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
6200: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6210: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
6220: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  /.      if( nTok
6230: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  en ){.        ch
6240: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
6250: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6260: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
6270: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  wSize];.        
6280: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
6290: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
62a0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  en);.      }..  
62b0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
62c0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
62d0: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
62e0: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  y) ){.        /*
62f0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
6300: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
6310: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
6320: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mber. */.       
6330: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6340: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
6350: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
6360: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
6370: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
6380: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
6390: 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65  Select, isReduce
63a0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
63b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
63c0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
63d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
63e0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
63f0: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6400: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6410: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6420: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
6430: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
6440: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
6450: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e  asAnyProperty(pN
6460: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
6470: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6480: 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b          zAlloc +
6490: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
64a0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
64b0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
64c0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
64d0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
64e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
64f0: 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28  pLeft = exprDup(
6500: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
6510: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6520: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6530: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
6540: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6550: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
6560: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
6570: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6580: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
65a0: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
65b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
65c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
65d0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20   pNew->flags2 = 
65e0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  0;.        if( !
65f0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6600: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
6610: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
6620: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
6630: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6640: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
6650: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6660: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
6670: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6680: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
6690: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
66a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
66b0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
66c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
66d0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
66e0: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
66f0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
6700: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
6710: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
6720: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
6730: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
6740: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
6750: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
6760: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
6770: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
6780: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
6790: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
67a0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
67b0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
67c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
67d0: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
67e0: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
67f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6800: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
6810: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
6820: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
6830: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
6840: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
6850: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
6860: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6870: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
6880: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
6890: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
68a0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
68b0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
68c0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
68d0: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
68e0: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
68f0: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
6900: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
6910: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
6920: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6930: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6940: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
6950: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
6960: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
6970: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
6980: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6990: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
69a0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
69b0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
69c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
69d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
69e0: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
69f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
6a00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6a10: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6a20: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75  .  return exprDu
6a30: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
6a40: 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a  0);.}.ExprList *
6a50: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6a60: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
6a70: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
6a80: 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c   flags){.  ExprL
6a90: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
6aa0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6ab0: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
6ac0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
6ad0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
6ae0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
6af0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6b00: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
6b10: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
6b20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6b30: 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72    pNew->iECursor
6b40: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45   = 0;.  pNew->nE
6b50: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
6b60: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
6b70: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
6b80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6b90: 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45  ocRaw(db,  p->nE
6ba0: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
6bb0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
6bc0: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
6bd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6be0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
6bf0: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
6c00: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
6c10: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
6c20: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
6c30: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
6c40: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
6c50: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
6c60: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
6c70: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
6c80: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
6c90: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
6ca0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
6cb0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
6cc0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
6cd0: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
6ce0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
6cf0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
6d00: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
6d10: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
6d20: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
6d30: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
6d40: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
6d50: 20 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d     pItem->iCol =
6d60: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b   pOldItem->iCol;
6d70: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69  .    pItem->iAli
6d80: 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  as = pOldItem->i
6d90: 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74  Alias;.  }.  ret
6da0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
6db0: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
6dc0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
6dd0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
6de0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
6df0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
6e00: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
6e10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
6e20: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
6e30: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
6e40: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
6e50: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
6e60: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
6e70: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
6e80: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
6e90: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
6ea0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6eb0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
6ec0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ed0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
6ee0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6ef0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
6f00: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
6f10: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
6f20: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
6f30: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6f40: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
6f50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
6f60: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
6f70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6f80: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
6f90: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
6fa0: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
6fb0: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
6fc0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
6fd0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6fe0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
6ff0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7000: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7010: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
7020: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
7030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7040: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
7050: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7060: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
7070: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
7080: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7090: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
70a0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
70b0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
70c0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
70d0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
70e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
70f0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7100: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7110: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7120: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7130: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7140: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7150: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7160: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7170: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7180: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7190: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
71a0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
71b0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
71c0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
71d0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
71e0: 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f  isPopulated = pO
71f0: 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ldItem->isPopula
7200: 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ted;.    pNewIte
7210: 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
7220: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7230: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pOldItem->zIndex
7240: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7250: 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f  >notIndexed = pO
7260: 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ldItem->notIndex
7270: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
7280: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  ->pIndex = pOldI
7290: 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  tem->pIndex;.   
72a0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
72b0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
72c0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
72d0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
72e0: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
72f0: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
7300: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7310: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
7320: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
7330: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
7340: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
7350: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7360: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
7370: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
7380: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
7390: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
73a0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
73b0: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
73c0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
73d0: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
73e0: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
73f0: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
7400: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7410: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
7420: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
7430: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7440: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7450: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7460: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7470: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7480: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7490: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
74a0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
74b0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
74c0: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
74d0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
74e0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
74f0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
7500: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
7510: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
7520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7530: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
7540: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
7550: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
7560: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7570: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
7580: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
7590: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
75a0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
75b0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
75c0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
75d0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
75e0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
75f0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
7600: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
7610: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
7620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7630: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
7640: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
7650: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
7660: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
7670: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
7680: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
7690: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
76a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
76b0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
76c0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
76d0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
76e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
76f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7700: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
7710: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ist, flags);.  p
7720: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
7730: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
7740: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
7750: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
7760: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
7770: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
7780: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7790: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
77a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
77b0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
77c0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
77d0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
77e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
77f0: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
7800: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
7810: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7820: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7830: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
7840: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
7850: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
7860: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
7870: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
7880: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
7890: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
78a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
78b0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
78c0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
78d0: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
78e0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
78f0: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
7900: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
7910: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
7920: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
7930: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
7940: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
7950: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
7960: 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
7970: 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  0;.  pNew->addrO
7980: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
7990: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
79a0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
79b0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
79c0: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72  phm[2] = -1;.  r
79d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
79e0: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
79f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7a00: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7a10: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7a20: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7a30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
7a40: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7a50: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
7a60: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
7a70: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
7a80: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
7a90: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
7aa0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
7ab0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
7ac0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
7ad0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
7ae0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
7af0: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
7b00: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
7b10: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
7b20: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
7b30: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
7b40: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
7b50: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
7b60: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
7b70: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
7b80: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
7b90: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
7ba0: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
7bb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7bc0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7bd0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7be0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
7bf0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
7c00: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
7c10: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
7c20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
7c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
7c40: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
7c50: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
7c60: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
7c70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7c80: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
7c90: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
7ca0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
7cb0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
7cc0: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
7cd0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
7ce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
7cf0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
7d00: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
7d10: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  ->nAlloc==0 );. 
7d20: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
7d30: 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e  nAlloc<=pList->n
7d40: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75  Expr ){.    stru
7d50: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
7d60: 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d   *a;.    int n =
7d70: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
7d80: 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 4;.    a = sq
7d90: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
7da0: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  b, pList->a, n*s
7db0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
7dc0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
7dd0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
7de0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
7df0: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
7e00: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
7e10: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
7e20: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f 73  locSize(db, a)/s
7e30: 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d  izeof(a[0]);.  }
7e40: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
7e50: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
7e60: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
7e70: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
7e80: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
7e90: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
7ea0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
7eb0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
7ec0: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
7ed0: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
7ee0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7ef0: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
7f00: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
7f10: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
7f20: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
7f30: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
7f40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7f50: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
7f60: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
7f70: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
7f80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7f90: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
7fa0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
7fb0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
7fc0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
7fd0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
7fe0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
7ff0: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
8000: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
8010: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
8020: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
8030: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
8040: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
8050: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
8060: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
8070: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8080: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
8090: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
80a0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
80b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
80c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
80d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
80e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
80f0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
8100: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
8110: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
8120: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
8130: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
8140: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
8150: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
8160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
8170: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
8180: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
8190: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
81a0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
81b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
81c0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
81d0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
81e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
81f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8200: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8210: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
8220: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
8230: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
8240: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
8250: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
8260: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
8270: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8280: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
8290: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
82a0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
82b0: 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d  equote && pItem-
82c0: 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33  >zName ) sqlite3
82d0: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
82e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
82f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
8300: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
8310: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
8320: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
8330: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
8340: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8350: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
8360: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
8370: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
8380: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
8390: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
83a0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
83b0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
83c0: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
83d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
83e0: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
83f0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
8400: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
8410: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
8420: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8430: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8440: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8450: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
8460: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
8470: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
8480: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
8490: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
84a0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
84b0: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
84c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
84d0: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
84e0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
84f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
8500: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
8510: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
8520: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8530: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
8540: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
8550: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
8560: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
8570: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
8580: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
8590: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
85a0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
85b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
85c0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
85d0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
85e0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
85f0: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
8600: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8630: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
8640: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
8650: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
8660: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
8670: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
8680: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
8690: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
86a0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
86b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
86c0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
86d0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
86e0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
86f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8700: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8710: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
8720: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
8730: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
8740: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8750: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
8760: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
8770: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
8780: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
8790: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
87a0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
87b0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
87c0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
87d0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
87e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
87f0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8800: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
8810: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
8820: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
8830: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
8840: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
8850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8860: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
8870: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
8880: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
8890: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
88a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
88b0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
88c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
88d0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
88e0: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
88f0: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
8900: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
8910: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
8920: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
8930: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
8940: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
8950: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
8960: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8970: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8980: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
8990: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
89a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
89b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
89c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
89d0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
89e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
89f0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
8a00: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
8a10: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
8a20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
8a30: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
8a40: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20  lker callbacks. 
8a50: 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20   Walker.u.pi is 
8a60: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8a70: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
8a80: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
8a90: 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72  checking an expr
8aa0: 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a  ession to see.**
8ab0: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73   if it is a cons
8ac0: 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b  tant.  Set *Walk
8ad0: 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20  er.u.pi to 0 if 
8ae0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
8af0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  s.** not constan
8b00: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  t..**.** These c
8b10: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
8b20: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
8b30: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
8b40: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
8b50: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
8b60: 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73  stant().**     s
8b70: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
8b80: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a  tantNotJoin().**
8b90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8ba0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
8bb0: 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61  tion().**.*/.sta
8bc0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
8bd0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
8be0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
8bf0: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
8c00: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  If pWalker->u.i 
8c10: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
8c20: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
8c30: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
8c40: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
8c50: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
8c60: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
8c70: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
8c80: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
8c90: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
8ca0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
8cb0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
8cc0: 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73  .i==3 && ExprHas
8cd0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
8ce0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
8cf0: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
8d00: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  u.i = 0;.    ret
8d10: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
8d20: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
8d30: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
8d40: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
8d50: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
8d60: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
8d70: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
8d80: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
8d90: 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  nd pWalker->u.i=
8da0: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
8db0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
8dc0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
8dd0: 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30  .i==2 ) return 0
8de0: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
8df0: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
8e00: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
8e10: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
8e20: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
8e30: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
8e40: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
8e50: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8e60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
8e70: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
8e80: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
8e90: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
8ea0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8eb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
8ec0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
8ed0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
8ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
8ef0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61  UMN );.      pWa
8f00: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
8f10: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
8f20: 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75  Abort;.    defau
8f30: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
8f40: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8f50: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
8f60: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
8f70: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
8f80: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
8f90: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
8fa0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
8fb0: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
8fc0: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
8fd0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
8fe0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
8ff0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
9000: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
9010: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9020: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9030: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
9040: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
9050: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
9060: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
9070: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
9080: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
9090: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
90a0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
90b0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
90c0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
90d0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
90e0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
90f0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
9100: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
9110: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9120: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9130: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9140: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9150: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9160: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9170: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9180: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9190: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
91a0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
91b0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
91c0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
91d0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
91e0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
91f0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9200: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9210: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9220: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9230: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9240: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9250: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9260: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9270: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9280: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
9290: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
92a0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
92b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
92c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
92d0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
92e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
92f0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9300: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9310: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9320: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9330: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9340: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9350: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9360: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9370: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
9380: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
9390: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
93a0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
93b0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
93c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
93d0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
93e0: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
93f0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9400: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9410: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9420: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9430: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9440: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9450: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9460: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
9470: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
9480: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
9490: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
94a0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
94b0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
94c0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
94d0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
94e0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
94f0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9500: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9510: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9520: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9530: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9540: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9550: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9560: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9570: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9580: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9590: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
95a0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
95b0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
95c0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
95d0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
95e0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
95f0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9600: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9610: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9620: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9630: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9640: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9650: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9660: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9670: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9680: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
9690: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
96a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
96b0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
96c0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
96d0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
96e0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  0;.  if( p->flag
96f0: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
9700: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
9710: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
9720: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9730: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
9740: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9750: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
9760: 72 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49  rc = sqlite3GetI
9770: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
9780: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
9790: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
97a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
97b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
97c0: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
97d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
97e0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
97f0: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
9800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9810: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
9820: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
9830: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
9840: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9850: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
9860: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
9870: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
9880: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
9890: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
98a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
98b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
98c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65  ( rc ){.    asse
98d0: 72 74 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  rt( ExprHasAnyPr
98e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
98f0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9900: 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y).             
9910: 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 32 20    || (p->flags2 
9920: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
9930: 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ken)==0 );.    p
9940: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  ->op = TK_INTEGE
9950: 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  R;.    p->flags 
9960: 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
9970: 20 20 20 20 70 2d 3e 75 2e 69 56 61 6c 75 65 20      p->u.iValue 
9980: 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20  = *pValue;.  }. 
9990: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
99a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  *.** Return FALS
99b0: 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  E if there is no
99c0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
99d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
99e0: 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  be NULL..**.** I
99f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9a00: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f   might be NULL o
9a10: 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
9a20: 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c  ion is too compl
9a30: 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65  ex.** to tell re
9a40: 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a  turn TRUE.  .**.
9a50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9a60: 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70  is used as an op
9a70: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73  timization, to s
9a80: 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  kip OP_IsNull op
9a90: 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65  codes.** when we
9aa0: 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c   know that a val
9ab0: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  ue cannot be NUL
9ac0: 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c  L.  Hence, a fal
9ad0: 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28  se positive.** (
9ae0: 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77  returning TRUE w
9af0: 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20  hen in fact the 
9b00: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e  expression can n
9b10: 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69  ever be NULL) mi
9b20: 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c  ght.** be a smal
9b30: 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  l performance hi
9b40: 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  t but is otherwi
9b50: 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e  se harmless.  On
9b60: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61   the other.** ha
9b70: 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61  nd, a false nega
9b80: 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20  tive (returning 
9b90: 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72  FALSE when the r
9ba0: 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e  esult could be N
9bb0: 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b  ULL).** will lik
9bc0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ely result in an
9bd0: 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
9be0: 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64  r.  So when in d
9bf0: 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  oubt, return.** 
9c00: 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TRUE..*/.int sql
9c10: 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
9c20: 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29  l(const Expr *p)
9c30: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69  {.  u8 op;.  whi
9c40: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
9c50: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
9c60: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
9c70: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
9c80: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
9c90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
9ca0: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
9cb0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
9cc0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
9cd0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
9ce0: 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20  TRING:.    case 
9cf0: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
9d00: 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20  se TK_BLOB:.    
9d10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
9d20: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
9d30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
9d40: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
9d50: 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74  n OP_IsNull inst
9d60: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 74 65 73  ruction that tes
9d70: 74 73 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ts register iReg
9d80: 20 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f   and jumps.** to
9d90: 20 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73 74 20   location iDest 
9da0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
9db0: 69 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54  iReg is NULL.  T
9dc0: 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67  he value in iReg
9dd0: 20 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75 74 65   .** was compute
9de0: 64 20 62 79 20 70 45 78 70 72 2e 20 20 49 66 20  d by pExpr.  If 
9df0: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70  we can look at p
9e00: 45 78 70 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d  Expr at compile-
9e10: 74 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65  time and.** dete
9e20: 72 6d 69 6e 65 20 74 68 61 74 20 69 74 20 63 61  rmine that it ca
9e30: 6e 20 6e 65 76 65 72 20 67 65 6e 65 72 61 74 65  n never generate
9e40: 20 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68   a NULL, then th
9e50: 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72  e OP_IsNull oper
9e60: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
9e70: 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  omitted..*/.void
9e80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9e90: 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64  IsNullJump(.  Vd
9ea0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
9eb0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
9ec0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9ed0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78 70 72   */.  const Expr
9ee0: 20 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c   *pExpr,  /* Onl
9ef0: 79 20 67 65 6e 65 72 61 74 65 20 4f 50 5f 49 73  y generate OP_Is
9f00: 4e 75 6c 6c 20 69 66 20 74 68 69 73 20 65 78 70  Null if this exp
9f10: 72 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f  r can be NULL */
9f20: 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
9f30: 20 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74         /* Test t
9f40: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
9f50: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 4e 55   register for NU
9f60: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73  LL */.  int iDes
9f70: 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  t           /* J
9f80: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
9f90: 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f  value is null */
9fa0: 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .){.  if( sqlite
9fb0: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
9fc0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
9fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9fe0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
9ff0: 67 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d  g, iDest);.  }.}
a000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
a010: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
a020: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a030: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
a040: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
a050: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
a060: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
a070: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
a080: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
a090: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
a0a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a0b0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a0c0: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
a0d0: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
a0e0: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
a0f0: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
a100: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
a110: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
a120: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
a130: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
a140: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
a150: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
a160: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
a170: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a180: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
a190: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
a1a0: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
a1b0: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
a1c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a1d0: 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ONE ) return 1;.
a1e0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
a1f0: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
a200: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
a210: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
a220: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
a230: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
a240: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
a250: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
a260: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
a270: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
a280: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
a290: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
a2a0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
a2b0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
a2c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
a2d0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
a2e0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
a2f0: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
a300: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a310: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
a320: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
a330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
a340: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
a350: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
a360: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
a370: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a380: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
a390: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
a3a0: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
a3b0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
a3c0: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
a3d0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
a3e0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
a3f0: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
a400: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
a410: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
a420: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
a430: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
a440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
a450: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
a460: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
a470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a480: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
a490: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
a4a0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
a4b0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
a4c0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
a4d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
a4e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
a4f0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
a500: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
a510: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a520: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
a530: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
a540: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a550: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
a560: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
a570: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
a580: 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
a590: 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20  are able to the 
a5a0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69  IN operator opti
a5b0: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a  mization on a.**
a5c0: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
a5d0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78  rm.**.**       x
a5e0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
a5f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65  .**.** Where the
a600: 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73   SELECT... claus
a610: 65 20 69 73 20 61 73 20 73 70 65 63 69 66 69 65  e is as specifie
a620: 64 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74  d by the paramet
a630: 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f  er to this.** ro
a640: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
a650: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70   Select object p
a660: 61 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72  assed in has alr
a670: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f  eady been prepro
a680: 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a  cessed and no.**
a690: 20 65 72 72 6f 72 73 20 68 61 76 65 20 62 65 65   errors have bee
a6a0: 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e  n found..*/.#ifn
a6b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a6c0: 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
a6d0: 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46  int isCandidateF
a6e0: 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a  orInOpt(Select *
a6f0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
a700: 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
a710: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
a720: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
a730: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73   /* right-hand s
a760: 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c  ide of IN is SEL
a770: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
a780: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
a790: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a7a0: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
a7b0: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
a7c0: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
a7d0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
a7e0: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
a7f0: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
a800: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
a810: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
a820: 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
a830: 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
a840: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
a850: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
a860: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
a870: 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
a880: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
a890: 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
a8a0: 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
a8b0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
a8c0: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
a8d0: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
a8e0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
a8f0: 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
a900: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a910: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
a920: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
a930: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
a940: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
a950: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
a960: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
a970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
a980: 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f  LIMIT means no O
a990: 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70  FFSET */.  if( p
a9a0: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
a9b0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
a9c0: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
a9d0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
a9e0: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
a9f0: 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
aa00: 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
aa10: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
aa20: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
aa30: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
aa40: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
aa50: 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
aa60: 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
aa70: 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
aa80: 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
aa90: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
aaa0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
aab0: 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  Tab;.  if( NEVER
aac0: 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75  (pTab==0) ) retu
aad0: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
aae0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
aaf0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
ab00: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
ab10: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
ab20: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
ab30: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
ab40: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
ab50: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
ab60: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
ab70: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
ab80: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
ab90: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
aba0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  urn 0;       /* 
abb0: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  One column in th
abc0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
abd0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
abe0: 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
abf0: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
ac00: 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73   0; /* Result is
ac10: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72   a column */.  r
ac20: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
ac30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ac40: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
ac50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ac60: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
ac70: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ac80: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
ac90: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27  operator..** It'
aca0: 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64  s job is to find
acb0: 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
acc0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ree structure th
acd0: 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a  at may be used.*
ace0: 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74  * either to test
acf0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
ad00: 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  of the (...) set
ad10: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
ad20: 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65  hrough.** its me
ad30: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
ad40: 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
ad50: 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * The index of t
ad60: 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64  he cursor opened
ad70: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 28   on the b-tree (
ad80: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
ad90: 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a  database index .
ada0: 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74  ** or ephermal t
adb0: 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20  able) is stored 
adc0: 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65  in pX->iTable be
add0: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
ade0: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54  on returns..** T
adf0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
ae00: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
ae10: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
ae20: 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
ae30: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ae40: 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
ae50: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
ae60: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
ae70: 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
ae80: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
ae90: 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  X - The cursor w
aea0: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
aeb0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a  atabase index..*
aec0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
aed0: 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20   -   The cursor 
aee0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
aef0: 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65  specially create
af00: 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  d and.**        
af10: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
af20: 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
af30: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  table..**.** An 
af40: 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
af50: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
af60: 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
af70: 73 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 0a  s of the simple.
af80: 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ** form:.**.**  
af90: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
afa0: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
afb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e  **.** If the prN
afc0: 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  otFound paramete
afd0: 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65  r is 0, then the
afe0: 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
aff0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
b000: 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
b010: 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70  et members, skip
b020: 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61  ping any duplica
b030: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
b040: 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61  e an.** epherema
b050: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
b060: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
b070: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
b080: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
b090: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
b0a0: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
b0b0: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
b0c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
b0d0: 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49   it.** has a UNI
b0e0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
b0f0: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a  r UNIQUE index..
b100: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e  **.** If the prN
b110: 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  otFound paramete
b120: 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
b130: 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
b140: 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
b150: 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72   fast set member
b160: 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74  ship tests. In t
b170: 68 69 73 20 63 61 73 65 20 61 6e 20 65 70 68 65  his case an ephe
b180: 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
b190: 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c   .** be used unl
b1a0: 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ess <column> is 
b1b0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
b1c0: 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64  RY KEY or an ind
b1d0: 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f  ex can .** be fo
b1e0: 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e  und with <column
b1f0: 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
b200: 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  st column..**.**
b210: 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
b220: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
b230: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
b240: 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
b250: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65   function.** nee
b260: 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ds to know wheth
b270: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 74  er or not the st
b280: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
b290: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a   an SQL NULL .**
b2a0: 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20   value in order 
b2b0: 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76 61  to correctly eva
b2c0: 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
b2d0: 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59 2c  s like "X IN (Y,
b2e0: 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72   Z)"..** If ther
b2f0: 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
b300: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
b310: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
b320: 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
b330: 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
b340: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
b350: 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
b360: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
b370: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e  itten.** to *prN
b380: 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72  otFound. If ther
b390: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
b3a0: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
b3b0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
b3c0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
b3d0: 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74  NotFound is left
b3e0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
b3f0: 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
b400: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
b410: 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
b420: 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f  ored in *prNotFo
b430: 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73  und, then.** its
b440: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69   initial value i
b450: 73 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68 65 20  s NULL.  If the 
b460: 28 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72  (...) does not r
b470: 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a  emain constant.*
b480: 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69  * for the durati
b490: 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  on of the query 
b4a0: 28 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54  (i.e. the SELECT
b4b0: 20 77 69 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e   within the (...
b4c0: 29 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72 65 6c  ).** is a correl
b4d0: 61 74 65 64 20 73 75 62 71 75 65 72 79 29 20 74  ated subquery) t
b4e0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
b4f0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72   the allocated r
b500: 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 72 65  egister is.** re
b510: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68  set to NULL each
b520: 20 74 69 6d 65 20 74 68 65 20 73 75 62 71 75 65   time the subque
b530: 72 79 20 69 73 20 72 65 72 75 6e 2e 20 54 68 69  ry is rerun. Thi
b540: 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20  s allows the.** 
b550: 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64  caller to use vd
b560: 62 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65  be code equivale
b570: 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nt to the follow
b580: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ing:.**.**   if(
b590: 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20   register==NULL 
b5a0: 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75  ){.**     has_nu
b5b0: 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61  ll = <test if da
b5c0: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
b5d0: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20  tains null>.**  
b5e0: 20 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a     register = 1.
b5f0: 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20  **   }.**.** in 
b600: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72  order to avoid r
b610: 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74  unning the <test
b620: 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75   if data structu
b630: 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c  re contains null
b640: 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f  >.** test more o
b650: 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63  ften than is nec
b660: 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  essary..*/.#ifnd
b670: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b680: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
b690: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
b6a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b6b0: 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e  pr *pX, int *prN
b6c0: 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65  otFound){.  Sele
b6d0: 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
b700: 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
b710: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
b720: 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
b750: 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
b760: 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
b770: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
b780: 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
b790: 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
b7a0: 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
b7b0: 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  nt mustBeUnique 
b7c0: 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30  = (prNotFound==0
b7d0: 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
b7e0: 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
b7f0: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
b800: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
b810: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
b820: 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
b830: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
b840: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
b850: 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
b860: 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
b870: 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
b880: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
b890: 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
b8a0: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
b8b0: 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70  p = (ExprHasProp
b8c0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
b8d0: 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70  elect) ? pX->x.p
b8e0: 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69  Select : 0);.  i
b8f0: 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65  f( ALWAYS(pParse
b900: 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73  ->nErr==0) && is
b910: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
b920: 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  t(p) ){.    sqli
b930: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b940: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
b950: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
b960: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
b970: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
b980: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
b990: 45 78 70 72 3b 20 20 20 2f 2a 20 45 78 70 72 65  Expr;   /* Expre
b9a0: 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  ssion <column> *
b9b0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  /.    int iCol =
b9c0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
b9f0: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
ba00: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ba10: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ba20: 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
ba30: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
ba40: 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 54 61 62  coded */.    Tab
ba50: 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53  le *pTab = p->pS
ba60: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20  rc->a[0].pTab;  
ba70: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
ba80: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ble>. */.    int
ba90: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
bac0: 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
bad0: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
bae0: 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  an OP_VerifyCook
baf0: 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  ie and OP_TableL
bb00: 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
bb10: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
bb20: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
bb30: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
bb40: 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
bb50: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
bb60: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
bb70: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
bb80: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
bb90: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
bba0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
bbb0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
bbc0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
bbd0: 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c  lled from two pl
bbe0: 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61  aces. In both ca
bbf0: 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20  ses the vdbe.   
bc00: 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
bc10: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
bc20: 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65  So assume sqlite
bc30: 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c  3GetVdbe() is al
bc40: 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63  ways.    ** succ
bc50: 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20  essful here..   
bc60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76   */.    assert(v
bc70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  );.    if( iCol<
bc80: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
bc90: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
bca0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nMem;.      int 
bcb0: 69 41 64 64 72 3b 0a 0a 20 20 20 20 20 20 69 41  iAddr;..      iA
bcc0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bcd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
bce0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
bcf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
bd00: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
bd10: 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20  1, iMem);..     
bd20: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
bd30: 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
bd40: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
bd50: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
bd60: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
bd70: 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
bd80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
bd90: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
bda0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
bdb0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
bde0: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ariable */..    
bdf0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
be00: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  on sequence used
be10: 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73   by the comparis
be20: 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20  on. If an index 
be30: 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  is to.      ** b
be40: 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  e used in place 
be50: 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c  of a temp-table,
be60: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65   it must be orde
be70: 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20  red according.  
be80: 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63      ** to this c
be90: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
bea0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  e.  */.      Col
beb0: 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
bec0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
bed0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
bee0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70   pX->pLeft, pExp
bef0: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  r);..      /* Ch
bf00: 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
bf10: 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
bf20: 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
bf30: 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  rm the .      **
bf40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
bf50: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
bf60: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63  ffinity of the c
bf70: 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20  olumn. If.      
bf80: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  ** it is not, it
bf90: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
bfa0: 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65   to use any inde
bfb0: 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
bfc0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
bfd0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
bfe0: 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  pX);.      int a
bff0: 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54  ffinity_ok = (pT
c000: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
c010: 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66  ffinity==aff||af
c020: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f==SQLITE_AFF_NO
c030: 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  NE);..      for(
c040: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c050: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
c060: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
c070: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
c080: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
c090: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
c0a0: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
c0b0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
c0c0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c0d0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
c0e0: 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52  zColl[0], 0)==pR
c0f0: 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  eq.         && (
c100: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
c110: 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d   (pIdx->nColumn=
c120: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
c130: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20  ror!=OE_None)). 
c140: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
c150: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
c160: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c170: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
c180: 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  dr;.          ch
c190: 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20  ar *pKey;.  .   
c1a0: 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63         pKey = (c
c1b0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64  har *)sqlite3Ind
c1c0: 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
c1d0: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
c1e0: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
c1f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c200: 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20  OP_If, iMem);.  
c210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c220: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c230: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d  Integer, 1, iMem
c240: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
c250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c260: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
c270: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
c280: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
c2b0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
c2c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
c2d0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
c2e0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
c2f0: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
c300: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
c310: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
c320: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c330: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
c340: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
c350: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
c360: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
c370: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
c380: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
c390: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
c3a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c3c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
c3d0: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
c3e0: 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e  * Could not foun
c3f0: 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
c400: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
c410: 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
c420: 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
c430: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
c440: 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
c450: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
c460: 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
c470: 20 20 20 20 64 6f 75 62 6c 65 20 73 61 76 65 64      double saved
c480: 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
c490: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
c4a0: 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
c4b0: 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
c4c0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
c4d0: 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e  EPH;.    if( prN
c4e0: 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20  otFound ){.     
c4f0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72   *prNotFound = r
c500: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
c510: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
c530: 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
c540: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75  >nQueryLoop>(dou
c550: 62 6c 65 29 31 20 29 3b 0a 20 20 20 20 20 20 70  ble)1 );.      p
c560: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
c570: 70 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  p = (double)1;. 
c580: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
c590: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
c5a0: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
c5b0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
c5c0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
c5d0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
c5e0: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
c5f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c600: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
c610: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
c620: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
c630: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
c640: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
c650: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
c660: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
c670: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
c680: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
c690: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
c6a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c6b0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
c6c0: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
c6d0: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20  ries used as an 
c6e0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e  expression.** an
c6f0: 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  d IN operators. 
c700: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
c710: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
c720: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
c730: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
c740: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
c750: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
c760: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
c770: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
c780: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
c790: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
c7a0: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
c7b0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
c7c0: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
c7d0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
c7e0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
c7f0: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
c800: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
c810: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
c820: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
c830: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
c840: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
c850: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
c860: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
c870: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
c880: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
c890: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
c8a0: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
c8b0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
c8c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
c8d0: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
c8e0: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
c8f0: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
c900: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
c910: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
c920: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
c930: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
c940: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
c950: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
c960: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
c970: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
c980: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
c990: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
c9a0: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
c9b0: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
c9c0: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
c9d0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
c9e0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
c9f0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
ca00: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
ca10: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
ca20: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
ca30: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
ca40: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
ca50: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
ca60: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
ca70: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
ca80: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
ca90: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
caa0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
cab0: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
cac0: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
cad0: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
cae0: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
caf0: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
cb00: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
cb10: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
cb20: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
cb30: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
cb40: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
cb50: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
cb60: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
cb70: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
cb80: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
cb90: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
cba0: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
cbb0: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
cbc0: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
cbd0: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
cbe0: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
cbf0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
cc00: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
cc10: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
cc20: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
cc30: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
cc40: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
cc50: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
cc60: 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e  resense or absen
cc70: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
cc80: 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f  he RHS..**.** Fo
cc90: 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
cca0: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
ccb0: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
ccc0: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
ccd0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
cce0: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
ccf0: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
cd00: 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  curs, the return
cd10: 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a   value is 0..*/.
cd20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cd30: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
cd40: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
cd50: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
cd60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
cd70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cd80: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
cd90: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
cda0: 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
cdb0: 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
cdc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
cdd0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20  rMayHaveNull,   
cde0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
cdf0: 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
ce00: 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
ce10: 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
ce20: 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
ce30: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
ce40: 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
ce50: 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
ce60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  /.){.  int testA
ce70: 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ddr = 0;        
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce90: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
cea0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
ceb0: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
cee0: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
cef0: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
cf00: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
cf10: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
cf20: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
cf30: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
cf40: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
cf50: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
cf60: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
cf70: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
cf80: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
cf90: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
cfa0: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
cfb0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
cfc0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
cfd0: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
cfe0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
cff0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
d000: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
d010: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
d020: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
d030: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
d040: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
d050: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
d060: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
d070: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
d080: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
d090: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
d0a0: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
d0b0: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
d0c0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
d0d0: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
d0e0: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
d0f0: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
d100: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
d110: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
d120: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d130: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26  EP_VarSelect) &&
d140: 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
d150: 65 72 54 61 62 20 29 7b 0a 20 20 20 20 69 6e 74  erTab ){.    int
d160: 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d   mem = ++pParse-
d170: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
d180: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d190: 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20  OP_If, mem);.   
d1a0: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
d1b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d1c0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
d1d0: 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mem);.    assert
d1e0: 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20  ( testAddr>0 || 
d1f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d200: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a  ocFailed );.  }.
d210: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
d220: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
d230: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
d240: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
d250: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
d260: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
d270: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
d280: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
d290: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
d2a0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
d2b0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
d2c0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 0a 20 20  Expr->pLeft;..  
d2d0: 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65      if( rMayHave
d2e0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
d2f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d300: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d310: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a   rMayHaveNull);.
d320: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
d330: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
d340: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
d350: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
d360: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
d370: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
d380: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
d390: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
d3a0: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
d3b0: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
d3c0: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41  the same way.  A
d3d0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
d3e0: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
d3f0: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
d400: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
d410: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
d420: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
d430: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
d440: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
d450: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
d460: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
d470: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
d480: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
d490: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
d4a0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
d4b0: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
d4c0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
d4d0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
d4e0: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
d4f0: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
d500: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
d510: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
d520: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
d530: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
d540: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
d550: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
d560: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
d570: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
d580: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
d590: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
d5a0: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
d5b0: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
d5c0: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
d5d0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
d5e0: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
d5f0: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
d600: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
d610: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
d620: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
d630: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
d640: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
d650: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d660: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
d670: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78  enEphemeral, pEx
d680: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52  pr->iTable, !isR
d690: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 6d 65 6d  owid);.      mem
d6a0: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
d6b0: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
d6c0: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
d6d0: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20  .nField = 1;..  
d6e0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
d6f0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
d700: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
d710: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
d720: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
d730: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
d740: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
d750: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d760: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
d770: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
d780: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
d790: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
d7a0: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
d7b0: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
d7c0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
d7d0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
d7e0: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
d7f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
d800: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
d810: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
d820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
d830: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
d840: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
d850: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
d860: 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74      dest.affinit
d870: 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79  y = (u8)affinity
d880: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d890: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
d8a0: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
d8b0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
d8c0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
d8d0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d8e0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
d8f0: 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
d900: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
d910: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d920: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
d930: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
d940: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66  List;.        if
d950: 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21  ( ALWAYS(pEList!
d960: 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 && pEList->nE
d970: 78 70 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20  xpr>0) ){ .     
d980: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
d990: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[0] = sqlite3B
d9a0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
d9b0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
d9c0: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
d9d0: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
d9e0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
d9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
da00: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
da10: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
da20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
da30: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
da40: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
da50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
da60: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
da70: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
da80: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
da90: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
daa0: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
dab0: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
dac0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
dad0: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
dae0: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
daf0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
db00: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
db10: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
db20: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
db30: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
db40: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
db50: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
db60: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
db70: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
db80: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
db90: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
dba0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
dbb0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
dbc0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
dbd0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
dbe0: 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
dbf0: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
dc00: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
dc10: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
dc20: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
dc30: 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  }.        keyInf
dc40: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  o.aColl[0] = sql
dc50: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
dc60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
dc70: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  Left);..        
dc80: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
dc90: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
dca0: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
dcb0: 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
dcc0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
dcd0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
dce0: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
dcf0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
dd00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dd10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dd20: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
dd30: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
dd40: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
dd50: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
dd60: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
dd70: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
dd80: 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
dd90: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
dda0: 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
ddb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
ddc0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ddd0: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
dde0: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
ddf0: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
de00: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
de10: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
de20: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
de30: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
de40: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
de50: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
de60: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
de70: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
de80: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
de90: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
dea0: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
deb0: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
dec0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ded0: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
dee0: 72 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  r && !sqlite3Exp
def0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
df00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
df10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
df20: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
df30: 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20  ddr-1, 2);.     
df40: 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20         testAddr 
df50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
df60: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
df70: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
df80: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
df90: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
dfa0: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
dfb0: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
dfc0: 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
dfd0: 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
dfe0: 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
dff0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e000: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e010: 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
e020: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
e030: 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
e040: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e050: 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
e060: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
e070: 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
e080: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
e090: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
e0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e0c0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
e0d0: 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e100: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e110: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
e120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e130: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
e140: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
e150: 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
e160: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e170: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e180: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e190: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
e1a0: 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
e1b0: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
e1c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
e1d0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
e1e0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33  hange(pParse, r3
e1f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
e200: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e210: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
e220: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
e230: 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  able, r2);.     
e240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e250: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
e260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
e270: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
e280: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
e290: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
e2a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
e2b0: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
e2c0: 20 20 20 69 66 28 20 21 69 73 52 6f 77 69 64 20     if( !isRowid 
e2d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e2e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
e2f0: 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
e300: 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  &keyInfo, P4_KEY
e310: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
e320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e330: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  }..    case TK_E
e340: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
e350: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64  TK_SELECT:.    d
e360: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
e370: 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74  /* If this has t
e380: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
e390: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
e3a0: 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
e3b0: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
e3c0: 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
e3d0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
e3e0: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
e3f0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
e400: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
e410: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66   in iColumn.  If
e420: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
e430: 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  TS, write.      
e440: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20  ** an integer 0 
e450: 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20  (not exists) or 
e460: 31 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20  1 (exists) into 
e470: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20  a memory cell.  
e480: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72      ** and recor
e490: 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  d that memory ce
e4a0: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
e4b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
e4c0: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
e4f0: 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
e500: 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
e510: 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
e540: 77 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75  with SELECt resu
e550: 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  lt */..      tes
e560: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e570: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
e580: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e590: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
e5a0: 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
e5b0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
e5c0: 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
e5d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
e5e0: 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  T );..      asse
e5f0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
e600: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
e610: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
e620: 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
e630: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
e640: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
e650: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
e660: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29   ++pParse->nMem)
e670: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
e680: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
e690: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
e6a0: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
e6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e6c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e6d0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
e6e0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iParm);.        
e6f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e700: 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
e710: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
e720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
e730: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
e740: 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
e750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e760: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
e770: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
e780: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
e790: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
e7a0: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
e7b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e7c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
e7d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
e7e0: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
e7f0: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
e800: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
e810: 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
e820: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
e850: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
e860: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
e870: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e880: 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
e890: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e8a0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
e8b0: 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 50 61   rReg = dest.iPa
e8c0: 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
e8d0: 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
e8e0: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
e8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e900: 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20  f( testAddr ){. 
e910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e920: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
e930: 64 72 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr-1);.  }.  sql
e940: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
e950: 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20  (pParse, 1);..  
e960: 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
e970: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e980: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
e990: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e9a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
e9b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
e9c0: 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70  de for an IN exp
e9d0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
e9e0: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
e9f0: 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20   ...).**      x 
ea00: 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
ea10: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  , ...).**.** The
ea20: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
ea30: 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61  (LHS) is a scala
ea40: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
ea50: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
ea60: 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61  de (RHS).** is a
ea70: 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
ea80: 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20  or more values. 
ea90: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
eaa0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
eab0: 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e  HS is.** contain
eac0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
ead0: 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66  S.  The value of
eae0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eaf0: 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c  is unknown (NULL
eb00: 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20  ).** if the LHS 
eb10: 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  is NULL or if th
eb20: 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e LHS is not con
eb30: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
eb40: 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a  e RHS and the.**
eb50: 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   RHS contains on
eb60: 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
eb70: 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alues..**.** Thi
eb80: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
eb90: 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75  tes code will ju
eba0: 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  mp to destIfFals
ebb0: 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
ebc0: 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
ebd0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
ebe0: 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
ebf0: 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
ec00: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
ec10: 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
ec20: 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
ec30: 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
ec40: 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
ec50: 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
ec60: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
ec70: 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
ec80: 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gh..*/.static vo
ec90: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
eca0: 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70  deIN(.  Parse *p
ecb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
ecc0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
ecd0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
ece0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
ecf0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
ed00: 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73  /* The IN expres
ed10: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
ed20: 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20  stIfFalse,      
ed30: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
ed40: 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
ed50: 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
ed60: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e  */.  int destIfN
ed70: 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ull        /* Ju
ed80: 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72  mp here if the r
ed90: 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f  esults are unkno
eda0: 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  wn due to NULLs 
edb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73  */.){.  int rRhs
edc0: 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a  HasNull = 0;  /*
edd0: 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69   Register that i
ede0: 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f  s true if RHS co
edf0: 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
ee00: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66  es */.  char aff
ee10: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a  inity;        /*
ee20: 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69   Comparison affi
ee30: 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20  nity to use */. 
ee40: 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
ee50: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
ee60: 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
ee70: 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
ee80: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
ee90: 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
eea0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
eeb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
eec0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
eed0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
eee0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52  /* Compute the R
eef0: 48 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73  HS.   After this
ef00: 20 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65   step, the table
ef10: 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a   with cursor.  *
ef20: 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
ef30: 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68  will contains th
ef40: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
ef50: 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20  ke up the RHS.. 
ef60: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
ef70: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
ef80: 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
ef90: 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
efa0: 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
efb0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
efc0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
efd0: 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
efe0: 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
eff0: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
f000: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
f010: 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20  rRhsHasNull);.. 
f020: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
f030: 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  he affinity to u
f040: 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b  se to create a k
f050: 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ey from the resu
f060: 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  lts.  ** of the 
f070: 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
f080: 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
f090: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
f0a0: 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a  uitable for.  **
f0b0: 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
f0c0: 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66  cord..  */.  aff
f0d0: 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73  inity = comparis
f0e0: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
f0f0: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68  );..  /* Code th
f100: 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72  e LHS, the <expr
f110: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
f120: 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20  N (...)"..  */. 
f130: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f140: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
f150: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f160: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f170: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
f180: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f190: 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20  ->pLeft, r1);.. 
f1a0: 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69   /* If the LHS i
f1b0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
f1c0: 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68 65   result is eithe
f1d0: 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20  r false or NULL 
f1e0: 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f  depending.  ** o
f1f0: 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52 48  n whether the RH
f200: 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f  S is empty or no
f210: 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
f220: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
f230: 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
f240: 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68  lse ){.    /* Sh
f250: 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
f260: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
f270: 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e   the false and N
f280: 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65  ULL outcomes are
f290: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
f2a0: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
f2b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f2c0: 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73  _IsNull, r1, des
f2d0: 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  tIfNull);.  }els
f2e0: 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  e{.    int addr1
f2f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f300: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
f310: 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c  ll, r1);.    sql
f320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f330: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78  , OP_Rewind, pEx
f340: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
f350: 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71  IfFalse);.    sq
f360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f370: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
f380: 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
f390: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f3a0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
f3b0: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
f3c0: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
f3d0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
f3e0: 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
f3f0: 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  is the ROWID of 
f400: 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20  table b-tree.   
f410: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f420: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f430: 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64  MustBeInt, r1, d
f440: 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
f450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f460: 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
f470: 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
f480: 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
f490: 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r1);.  }else{.  
f4a0: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
f4b0: 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e  e, the RHS is an
f4c0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20   index b-tree.. 
f4d0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
f4e0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f4f0: 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20  P_Affinity, r1, 
f500: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
f510: 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   1);..    /* If 
f520: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68  the set membersh
f530: 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74  ip test fails, t
f540: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
f550: 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78  f the .    ** "x
f560: 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65   IN (...)" expre
f570: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69  ssion must be ei
f580: 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20  ther 0 or NULL. 
f590: 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a  If the set.    *
f5a0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  * contains no NU
f5b0: 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
f5c0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e  the result is 0.
f5d0: 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20 20   If the set .   
f5e0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65   ** contains one
f5f0: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
f600: 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
f610: 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
f620: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
f630: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20  s also NULL..   
f640: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73   */.    if( rRhs
f650: 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65  HasNull==0 || de
f660: 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
f670: 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
f680: 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
f690: 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77  ns if it is know
f6a0: 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  n at compile tim
f6b0: 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20  e that the RHS. 
f6c0: 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63       ** cannot c
f6d0: 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75  ontain NULL valu
f6e0: 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  es. This happens
f6f0: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20   as the result. 
f700: 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f       ** of a "NO
f710: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
f720: 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
f730: 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20  se schema..     
f740: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73   **.      ** Als
f750: 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63  o run this branc
f760: 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75  h if NULL is equ
f770: 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45  ivalent to FALSE
f780: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
f790: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e  is particular IN
f7a0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20   operator..     
f7b0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
f7c0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
f7d0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70  , OP_NotFound, p
f7e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
f7f0: 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31  stIfFalse, r1, 1
f800: 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  );..    }else{. 
f810: 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
f820: 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20  branch, the RHS 
f830: 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20  of the IN might 
f840: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61  contain a NULL a
f850: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
f860: 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55  presence of a NU
f870: 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61  LL on the RHS ma
f880: 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65  kes a difference
f890: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
f8a0: 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20   outcome..      
f8b0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c  */.      int j1,
f8c0: 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20   j2, j3;..      
f8d0: 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  /* First check t
f8e0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
f8f0: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
f900: 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f   the RHS.  If so
f910: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
f920: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
f930: 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
f940: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
f950: 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20  , so jump.      
f960: 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
f970: 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
f980: 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lows..      */. 
f990: 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
f9a0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
f9b0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
f9c0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31  r->iTable, 0, r1
f9d0: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 1);..      /* 
f9e0: 48 65 72 65 20 77 65 20 62 65 67 69 6e 20 67 65  Here we begin ge
f9f0: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68  nerating code th
fa00: 61 74 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c  at runs if the L
fa10: 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  HS is not.      
fa20: 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
fa30: 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65  hin the RHS.  Ge
fa40: 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61  nerate additiona
fa50: 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  l code that.    
fa60: 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52    ** tests the R
fa70: 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49  HS for NULLs.  I
fa80: 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  f the RHS contai
fa90: 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20  ns a NULL then. 
faa0: 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
fab0: 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
fac0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c  there are no NUL
fad0: 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  Ls in the RHS th
fae0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70  en.      ** jump
faf0: 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e   to destIfFalse.
fb00: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fb10: 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
fb20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
fb30: 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
fb40: 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73  l);.      j3 = s
fb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
fb60: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
fb70: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
fb80: 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  0, rRhsHasNull, 
fb90: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
fba0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fbb0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72  P_Integer, -1, r
fbc0: 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
fbd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fbe0: 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20  mpHere(v, j3);. 
fbf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
fc10: 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  Imm, rRhsHasNull
fc20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
fc30: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fc40: 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f  v, j2);..      /
fc50: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70  * Jump to the ap
fc60: 70 72 6f 70 72 69 61 74 65 20 74 61 72 67 65 74  propriate target
fc70: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
fc80: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20  ether or not.   
fc90: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f     ** the RHS co
fca0: 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20  ntains a NULL.  
fcb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
fcc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fcd0: 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73  , OP_If, rRhsHas
fce0: 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
fcf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fd00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fd10: 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
fd20: 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  False);..      /
fd30: 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61  * The OP_Found a
fd40: 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
fd50: 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68  s branch jumps h
fd60: 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a  ere when true, .
fd70: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67        ** causing
fd80: 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20   the overall IN 
fd90: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
fda0: 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68  ation to fall th
fdb0: 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  rough..      */.
fdc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fdd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
fde0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
fdf0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
fe00: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
fe10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
fe20: 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
fe30: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
fe40: 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
fe50: 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
fe60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
fe70: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
fe80: 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d   Duplicate an 8-
fe90: 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74  byte value.*/.st
fea0: 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62  atic char *dup8b
feb0: 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f  ytes(Vdbe *v, co
fec0: 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20  nst char *in){. 
fed0: 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c   char *out = sql
fee0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
fef0: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
ff00: 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  , 8);.  if( out 
ff10: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75  ){.    memcpy(ou
ff20: 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20  t, in, 8);.  }. 
ff30: 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a   return out;.}..
ff40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ff50: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
ff60: 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
ff70: 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
ff80: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
ff90: 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
ffa0: 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
ffb0: 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
ffc0: 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
ffd0: 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
ffe0: 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
fff0: 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
10000 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
10010 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
10020 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
10030 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
10040 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
10050 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
10060 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
10070 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
10080 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
10090 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
100a0 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
100b0 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
100c0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
100d0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
100e0 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
100f0 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61  e value;.    cha
10100 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74  r *zV;.    sqlit
10110 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
10120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
10130 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
10140 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
10150 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
10160 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
10170 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
10180 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
10190 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79  .    zV = dup8by
101a0 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
101b0 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alue);.    sqlit
101c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
101d0 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
101e0 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c  , 0, zV, P4_REAL
101f0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
10200 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10210 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
10220 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
10230 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
10240 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
10250 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
10260 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
10270 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
10280 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
10290 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
102a0 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
102b0 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
102c0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
102d0 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
102e0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
102f0 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
10300 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
10310 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
10320 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
10330 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
10340 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10350 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
10360 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
10370 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
10380 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
10390 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
103a0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
103b0 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
103c0 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 6e  Value;.    if( n
103d0 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
103e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
103f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10400 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
10410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
10420 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
10430 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
10440 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
10450 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10460 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c  3FitsIn64Bits(z,
10470 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
10480 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
10490 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
104a0 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
104b0 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
104c0 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
104d0 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
104e0 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  ;.      zV = dup
104f0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
10500 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
10510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10520 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
10530 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
10540 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
10550 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
10560 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
10570 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
10580 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10590 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
105a0 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
105b0 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
105c0 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  "", z);.#else.  
105d0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
105e0 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
105f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
10600 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
10610 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
10620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10630 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
10640 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10650 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
10660 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
10670 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
10680 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
10690 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
106a0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
106b0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
106c0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
106d0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
106e0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
106f0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
10700 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
10710 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
10720 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
10730 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
10740 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
10750 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
10760 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
10770 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
10780 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
10790 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
107a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
107b0 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
107c0 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
107d0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
107e0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
107f0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
10800 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
10810 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
10820 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
10830 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
10840 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
10850 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
10860 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
10870 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
10880 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
10890 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
108a0 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
108b0 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
108c0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
108d0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
108e0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
108f0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
10900 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
10910 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
10920 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
10930 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
10940 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
10950 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
10960 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
10970 43 6f 6c 75 6d 6e 43 61 63 68 65 20 29 20 72 65  ColumnCache ) re
10980 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
10990 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
109a0 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
109b0 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
109c0 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
109d0 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
109e0 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
109f0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
10a00 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
10a10 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
10a20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
10a30 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
10a40 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
10a50 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
10a60 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
10a70 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
10a80 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
10a90 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
10aa0 0a 23 69 66 20 30 20 2f 2a 20 54 68 69 73 20 63  .#if 0 /* This c
10ab0 6f 64 65 20 77 6f 6c 64 20 72 65 6d 6f 76 65 20  ode wold remove 
10ac0 74 68 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  the entry from t
10ad0 68 65 20 63 61 63 68 65 20 69 66 20 69 74 20 65  he cache if it e
10ae0 78 69 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 66  xisted */.    if
10af0 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
10b00 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20  iTable==iTab && 
10b10 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
10b20 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
10b30 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
10b40 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
10b50 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
10b60 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
10b70 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
10b80 67 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  g;.      p->lru 
10b90 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
10ba0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
10bb0 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  urn;.    }.#endi
10bc0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
10bd0 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  >iReg==0 || p->i
10be0 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70  Table!=iTab || p
10bf0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20  ->iColumn!=iCol 
10c00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
10c10 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74   /* Find an empt
10c20 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61  y slot and repla
10c30 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69  ce it */.  for(i
10c40 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
10c50 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
10c60 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
10c70 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
10c80 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20   p->iReg==0 ){. 
10c90 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d       p->iLevel =
10ca0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
10cb0 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69  evel;.      p->i
10cc0 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
10cd0 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
10ce0 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e   iCol;.      p->
10cf0 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
10d00 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
10d10 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  0;.      p->lru 
10d20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
10d30 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
10d40 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
10d50 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
10d60 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75   last recently u
10d70 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20  sed */.  minLru 
10d80 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
10d90 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66  idxLru = -1;.  f
10da0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
10db0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
10dc0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
10dd0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
10de0 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
10df0 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c  ru ){.      idxL
10e00 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69  ru = i;.      mi
10e10 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
10e20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41     }.  }.  if( A
10e30 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29  LWAYS(idxLru>=0)
10e40 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61   ){.    p = &pPa
10e50 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
10e60 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69  dxLru];.    p->i
10e70 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
10e80 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
10e90 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
10ea0 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  b;.    p->iColum
10eb0 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = iCol;.    p-
10ec0 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
10ed0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
10ee0 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70  ;.    p->lru = p
10ef0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
10f00 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
10f10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64    }.}../*.** Ind
10f20 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73  icate that regis
10f30 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65  ters between iRe
10f40 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61  g..iReg+nReg-1 a
10f50 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  re being overwri
10f60 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74  tten..** Purge t
10f70 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  he range of regi
10f80 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63  sters from the c
10f90 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
10fa0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
10fb0 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73  CacheRemove(Pars
10fc0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
10fd0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
10fe0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
10ff0 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52  Last = iReg + nR
11000 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74  eg - 1;.  struct
11010 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
11020 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11030 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11040 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11050 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11060 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
11070 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
11080 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20  Reg && r<=iLast 
11090 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
110a0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
110b0 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
110c0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
110d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  }.}../*.** Remem
110e0 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ber the current 
110f0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e  column cache con
11100 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65  text.  Any new e
11110 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20  ntries added.** 
11120 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c  added to the col
11130 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20  umn cache after 
11140 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65  this call are re
11150 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  moved when the.*
11160 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
11170 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  pop occurs..*/.v
11180 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11190 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a  achePush(Parse *
111a0 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
111b0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b  e->iCacheLevel++
111c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
111d0 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
111e0 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
111f0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
11200 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
11210 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20   the previous N 
11220 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e  Push operations.
11230 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11240 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 61  , restore the ca
11250 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  che.** to the st
11260 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20  ate it was in N 
11270 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76  Pushes ago..*/.v
11280 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11290 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
112a0 50 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20  Parse, int N){. 
112b0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
112c0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
112d0 20 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a   assert( N>0 );.
112e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
112f0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e  ->iCacheLevel>=N
11300 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
11310 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a  acheLevel -= N;.
11320 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11330 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11340 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11350 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11360 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
11370 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61  && p->iLevel>pPa
11380 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11390 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
113a0 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
113b0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
113c0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
113d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
113e0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
113f0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
11400 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
11410 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
11420 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
11430 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
11440 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
11450 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
11460 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
11470 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
11480 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
11490 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
114a0 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
114b0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
114c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
114d0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
114e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
114f0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
11500 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
11510 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
11520 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11530 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11540 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11550 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11560 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
11570 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
11580 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
11590 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
115a0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
115b0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
115c0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
115d0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
115e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
115f0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
11600 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
11610 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
11620 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
11630 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
11640 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
11650 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
11660 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
11670 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
11680 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ur,    /* The cu
11690 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74 61  rsor for this ta
116a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ble */.  int iCo
116b0 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
116c0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
116d0 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
116e0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
116f0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
11700 61 6c 75 64 20 69 6e 74 6f 20 74 68 69 73 20 72  alud into this r
11710 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
11720 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
11730 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
11740 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11750 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11760 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72  owid, iTabCur, r
11770 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
11780 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
11790 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
117a0 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
117b0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
117c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
117d0 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 69 43   op, iTabCur, iC
117e0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
117f0 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
11800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
11810 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
11820 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
11830 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
11840 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
11850 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
11860 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
11870 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
11880 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
11890 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
118a0 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
118b0 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
118c0 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
118d0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
118e0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
118f0 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
11900 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
11910 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
11920 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
11930 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
11940 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
11950 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
11960 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
11970 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
11980 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
11990 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
119a0 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
119b0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
119c0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
119d0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
119e0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
119f0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
11a00 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
11a10 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
11a20 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
11a30 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
11a40 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
11a50 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
11a60 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
11a70 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
11a80 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
11a90 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
11aa0 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
11ab0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
11ac0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
11ad0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
11ae0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
11af0 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
11b00 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
11b10 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
11b20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11b30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
11b40 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
11b50 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
11b60 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11b70 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11b80 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11b90 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
11ba0 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
11bb0 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
11bc0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
11bd0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
11be0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
11bf0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
11c00 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
11c10 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
11c20 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
11c30 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
11c40 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
11c50 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
11c60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11c70 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
11c80 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
11c90 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
11ca0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
11cb0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
11cc0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
11cd0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 72 65 74 75  n, iReg);.  retu
11ce0 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
11cf0 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
11d00 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
11d10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11d20 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
11d30 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
11d40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
11d50 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
11d60 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
11d70 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
11d80 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
11d90 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11da0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
11db0 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
11dc0 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
11dd0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
11de0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
11df0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f   }.}../*.** Reco
11e00 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
11e10 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
11e20 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
11e30 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
11e40 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
11e50 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
11e60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
11e70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
11e80 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
11e90 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
11ea0 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73  int iCount){.  s
11eb0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
11ec0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53  emove(pParse, iS
11ed0 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d  tart, iCount);.}
11ee0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11ef0 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
11f00 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
11f10 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
11f20 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
11f30 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
11f40 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
11f50 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
11f60 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
11f70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
11f80 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
11f90 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
11fa0 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
11fb0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
11fc0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
11fd0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69 46  ;.  if( NEVER(iF
11fe0 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75  rom==iTo) ) retu
11ff0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn;.  sqlite3Vdb
12000 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e  eAddOp3(pParse->
12010 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20  pVdbe, OP_Move, 
12020 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67  iFrom, iTo, nReg
12030 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  );.  for(i=0, p=
12040 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
12050 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
12060 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
12070 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
12080 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
12090 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46  x>=iFrom && x<iF
120a0 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  rom+nReg ){.    
120b0 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f    p->iReg += iTo
120c0 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20  -iFrom;.    }.  
120d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
120e0 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 70 79  ate code to copy
120f0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
12100 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
12110 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
12120 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
12130 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64  +nReg-1..*/.void
12140 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12150 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
12160 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
12170 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
12180 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12190 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69  ( NEVER(iFrom==i
121a0 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  To) ) return;.  
121b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b  for(i=0; i<nReg;
121c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
121d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
121e0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
121f0 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54  opy, iFrom+i, iT
12200 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  o+i);.  }.}..#if
12210 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12220 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
12230 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
12240 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
12250 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
12260 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
12270 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
12280 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
12290 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
122a0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
122b0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
122c0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
122d0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
122e0 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
122f0 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
12300 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
12310 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
12320 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
12330 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
12340 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
12350 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
12360 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
12370 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
12380 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
12390 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
123a0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
123b0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
123c0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
123d0 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
123e0 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
123f0 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
12400 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
12410 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
12420 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
12430 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
12440 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
12450 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
12460 49 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  If the last inst
12470 72 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73  ruction coded is
12480 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f   an ephemeral co
12490 70 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20  py of any of.** 
124a0 74 68 65 20 72 65 67 69 73 74 65 72 73 20 69 6e  the registers in
124b0 20 74 68 65 20 6e 52 65 67 20 72 65 67 69 73 74   the nReg regist
124c0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ers beginning wi
124d0 74 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a  th iReg, then.**
124e0 20 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73   convert the las
124f0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72  t instruction fr
12500 6f 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f  om OP_SCopy to O
12510 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20  P_Copy..*/.void 
12520 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43  sqlite3ExprHardC
12530 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  opy(Parse *pPars
12540 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
12550 20 6e 52 65 67 29 7b 0a 20 20 56 64 62 65 4f 70   nReg){.  VdbeOp
12560 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76   *pOp;.  Vdbe *v
12570 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
12580 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12590 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 76 20  ailed==0 );.  v 
125a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
125b0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
125c0 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  );.  pOp = sqlit
125d0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
125e0 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  1);.  assert( pO
125f0 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  p!=0 );.  if( pO
12600 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43  p->opcode==OP_SC
12610 6f 70 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d  opy && pOp->p1>=
12620 69 52 65 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c  iReg && pOp->p1<
12630 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20  iReg+nReg ){.   
12640 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
12650 50 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f  P_Copy;.  }.}../
12660 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12670 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
12680 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 41 6c  value of the iAl
12690 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69 6e 20  ias-th alias in 
126a0 72 65 67 69 73 74 65 72 0a 2a 2a 20 74 61 72 67  register.** targ
126b0 65 74 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  et.  The first t
126c0 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ime this is call
126d0 65 64 2c 20 70 45 78 70 72 20 69 73 20 65 76 61  ed, pExpr is eva
126e0 6c 75 61 74 65 64 20 74 6f 20 63 6f 6d 70 75 74  luated to comput
126f0 65 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  e.** the value o
12700 66 20 74 68 65 20 61 6c 69 61 73 2e 20 20 54 68  f the alias.  Th
12710 65 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65  e value is store
12720 64 20 69 6e 20 61 6e 20 61 75 78 69 6c 69 61 72  d in an auxiliar
12730 79 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  y register.** an
12740 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
12750 74 68 61 74 20 72 65 67 69 73 74 65 72 20 69 73  that register is
12760 20 72 65 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73   returned.  On s
12770 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c  ubsequent calls,
12780 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
12790 20 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72   number is retur
127a0 6e 65 64 20 77 69 74 68 6f 75 74 20 67 65 6e 65  ned without gene
127b0 72 61 74 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e  rating any code.
127c0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
127d0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   in order for th
127e0 69 73 20 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65  is to work, code
127f0 20 6d 75 73 74 20 62 65 20 67 65 6e 65 72 61 74   must be generat
12800 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d  ed in the.** sam
12810 65 20 6f 72 64 65 72 20 74 68 61 74 20 69 74 20  e order that it 
12820 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a  is executed..**.
12830 2a 2a 20 41 6c 69 61 73 65 73 20 61 72 65 20 6e  ** Aliases are n
12840 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
12850 20 77 69 74 68 20 31 2e 20 20 53 6f 20 69 41 6c   with 1.  So iAl
12860 69 61 73 20 69 73 20 69 6e 20 74 68 65 20 72 61  ias is in the ra
12870 6e 67 65 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70  nge.** of 1 to p
12880 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e  Parse->nAlias in
12890 63 6c 75 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a  clusive.  .**.**
128a0 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b   pParse->aAlias[
128b0 69 41 6c 69 61 73 2d 31 5d 20 72 65 63 6f 72 64  iAlias-1] record
128c0 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  s the register n
128d0 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
128e0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
128f0 69 41 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20  iAlias-th alias 
12900 69 73 20 73 74 6f 72 65 64 2e 20 20 49 66 20 7a  is stored.  If z
12910 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
12920 74 68 61 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61  that the.** alia
12930 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  s has not yet be
12940 65 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a  en computed..*/.
12950 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
12960 6c 69 61 73 28 50 61 72 73 65 20 2a 70 50 61 72  lias(Parse *pPar
12970 73 65 2c 20 69 6e 74 20 69 41 6c 69 61 73 2c 20  se, int iAlias, 
12980 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
12990 20 74 61 72 67 65 74 29 7b 0a 23 69 66 20 30 0a   target){.#if 0.
129a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
129b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
129c0 74 20 69 52 65 67 3b 0a 20 20 69 66 28 20 70 50  t iReg;.  if( pP
129d0 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f  arse->nAliasAllo
129e0 63 3c 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  c<pParse->nAlias
129f0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
12a00 61 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  aAlias = sqlite3
12a10 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
12a20 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c 69  db, pParse->aAli
12a30 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72       sizeof(pPar
12a60 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70  se->aAlias[0])*p
12a70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b  Parse->nAlias );
12a80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64  .    testcase( d
12a90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12aa0 26 26 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  && pParse->nAlia
12ab0 73 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20 20  sAlloc>0 );.    
12ac0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12ad0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
12ae0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 50 61  .    memset(&pPa
12af0 72 73 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61 72  rse->aAlias[pPar
12b00 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 5d  se->nAliasAlloc]
12b10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
12b20 28 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 2d  (pParse->nAlias-
12b30 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c  pParse->nAliasAl
12b40 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 70 50 61 72  loc)*sizeof(pPar
12b50 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29 3b  se->aAlias[0]));
12b60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c  .    pParse->nAl
12b70 69 61 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72 73  iasAlloc = pPars
12b80 65 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a 20  e->nAlias;.  }. 
12b90 20 61 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e   assert( iAlias>
12ba0 30 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61  0 && iAlias<=pPa
12bb0 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20  rse->nAlias );. 
12bc0 20 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e   iReg = pParse->
12bd0 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
12be0 3b 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20  ;.  if( iReg==0 
12bf0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
12c00 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 30  e->iCacheLevel>0
12c10 20 29 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d   ){.      iReg =
12c20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12c30 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
12c40 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
12c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c60 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iReg = ++pParse-
12c70 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
12c80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
12c90 72 73 65 2c 20 70 45 78 70 72 2c 20 69 52 65 67  rse, pExpr, iReg
12ca0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
12cb0 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31  >aAlias[iAlias-1
12cc0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d 0a  ] = iReg;.    }.
12cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
12ce0 67 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  g;.#else.  UNUSE
12cf0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 41 6c 69  D_PARAMETER(iAli
12d00 61 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  as);.  return sq
12d10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
12d20 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
12d30 72 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64  r, target);.#end
12d40 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
12d50 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
12d60 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
12d70 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
12d80 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
12d90 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
12da0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
12db0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
12dc0 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
12dd0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
12de0 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
12df0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
12e00 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
12e10 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
12e20 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
12e30 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
12e40 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
12e50 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
12e60 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
12e70 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
12e80 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
12e90 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
12ea0 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
12eb0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
12ec0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
12ed0 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
12ee0 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
12ef0 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
12f00 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
12f10 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
12f20 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
12f30 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
12f40 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
12f50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12f60 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
12f70 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
12f80 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
12f90 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
12fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12fb0 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
12fc0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
12fd0 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
12fe0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
12ff0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
13000 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
13010 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
13020 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
13030 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
13040 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
13050 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
13060 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
13070 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
13080 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
13090 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
130a0 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
130b0 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
130c0 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
130d0 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
130e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
130f0 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
13100 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13110 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
13120 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
13130 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
13140 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
13150 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
13160 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
13170 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
13180 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
13190 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
131a0 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
131b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
131c0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
131d0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
131e0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
131f0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
13200 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
13210 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
13220 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
13230 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
13240 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
13250 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
13260 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
13270 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
13280 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
13290 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
132a0 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
132b0 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
132c0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
132d0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
132e0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
132f0 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
13300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13310 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
13320 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
13330 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  >sortingIdx,.   
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
13360 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
13370 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
13380 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13390 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
133a0 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
133b0 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
133c0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
133d0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
133e0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
133f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
13400 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
13410 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
13420 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
13430 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
13440 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13450 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
13460 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
13470 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
13480 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
13490 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ase;.      }else
134a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
134b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
134c0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
134d0 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a  e, pExpr->pTab,.
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
13510 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
13520 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
13530 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13540 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13550 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
13560 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
13570 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
13580 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
13590 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
135a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
135b0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
135c0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
135d0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
135e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
135f0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
13600 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
13610 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
13620 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
13630 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
13640 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
13650 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
13660 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
13670 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
13680 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
13690 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
136a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
136b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
136c0 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20  ng8, 0, target, 
136d0 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
136e0 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  en, 0);.      br
136f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13700 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
13710 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13720 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
13730 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
13740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13750 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13760 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
13770 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
13780 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
13790 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
137a0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
137b0 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
137c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
137d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
137e0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
137f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13800 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
13810 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
13820 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
13830 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
13840 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
13850 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
13860 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
13870 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
13880 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
13890 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
138a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
138b0 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
138c0 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
138d0 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
138e0 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
138f0 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
13900 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13910 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
13920 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
13930 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
13940 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13950 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
13960 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
13970 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
13980 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
13990 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
139a0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
139b0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
139c0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
139d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
139e0 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
139f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
13a10 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
13a20 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
13a30 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
13a40 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
13a50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13a60 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
13a70 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 75 2e  v, -1, pExpr->u.
13a80 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
13a90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13aa0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13ab0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
13ac0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
13ad0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
13ae0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13af0 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
13b00 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 63  .      inReg = c
13b10 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c  odeAlias(pParse,
13b20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
13b30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
13b40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
13b50 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
13b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
13b70 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
13b80 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
13b90 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
13ba0 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
13bb0 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
13bc0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
13bd0 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69  , to_op;.      i
13be0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
13bf0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
13c00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13c10 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
13c20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13c30 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13c40 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13c50 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  ;.      aff = sq
13c60 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
13c70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
13c80 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20  n);.      to_op 
13c90 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
13ca0 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
13cb0 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
13cc0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  t( to_op==OP_ToT
13cd0 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  ext    || aff!=S
13ce0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
13cf0 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
13d00 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  t( to_op==OP_ToB
13d10 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  lob    || aff!=S
13d20 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
13d30 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
13d40 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  t( to_op==OP_ToN
13d50 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53  umeric || aff!=S
13d60 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
13d70 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
13d80 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  t( to_op==OP_ToI
13d90 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
13da0 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
13db0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
13dc0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  t( to_op==OP_ToR
13dd0 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  eal    || aff!=S
13de0 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
13df0 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63    );.      testc
13e00 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
13e10 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74  oText );.      t
13e20 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
13e30 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20  OP_ToBlob );.   
13e40 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
13e50 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
13e60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13e70 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
13e80 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
13e90 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
13ea0 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  _ToReal );.     
13eb0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
13ec0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
13ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13ee0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
13ef0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
13f00 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
13f10 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
13f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13f30 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69  dOp1(v, to_op, i
13f40 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73  nReg);.      tes
13f50 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
13f60 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
13f70 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
13f80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
13f90 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
13fa0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
13fb0 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
13fc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
13fd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
13fe0 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
13ff0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
14000 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
14010 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
14020 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
14030 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
14040 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
14050 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
14060 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
14070 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
14080 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
14090 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
140a0 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
140b0 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
140c0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
140d0 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
140e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
140f0 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
14100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14110 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
14120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14130 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
14140 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14150 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
14160 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
14170 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
14180 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
14190 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
141a0 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
141b0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
141c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
141d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
141e0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
141f0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
14200 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14210 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
14220 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
14230 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
14240 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
14250 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
14260 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
14280 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
14290 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
142a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
142b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
142c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
142d0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
142e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
142f0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
14300 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
14310 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
14320 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
14330 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14340 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
14350 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14360 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14370 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14380 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14390 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
143a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
143b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
143c0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
143d0 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
143e0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
143f0 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
14400 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
14410 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14420 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
14430 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
14440 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
14450 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
14460 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45  STOREP2 | SQLITE
14470 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
14480 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14490 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
144a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
144b0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
144c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
144d0 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
144e0 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
144f0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
14500 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
14510 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
14520 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
14530 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
14540 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
14550 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
14560 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
14570 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
14580 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
14590 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
145a0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
145b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
145c0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
145d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
145e0 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
145f0 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
14600 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
14610 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
14620 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
14630 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14640 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
14650 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
14660 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
14670 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
14680 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14690 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
146a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
146b0 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
146c0 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
146d0 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
146e0 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
146f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14700 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
14710 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
14720 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
14730 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
14740 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14750 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
14760 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14770 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
14780 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14790 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
147a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
147b0 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
147c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
147d0 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74  K_REM );.      t
147e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
147f0 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
14800 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14810 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
14820 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14830 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
14840 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14850 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
14860 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14870 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
14880 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14890 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
148a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
148b0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
148c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
148d0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
148e0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
148f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14900 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
14910 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
14920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14930 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
14940 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
14950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14960 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14970 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14980 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
14990 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
149a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
149b0 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
149c0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
149d0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
149e0 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
149f0 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
14a00 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
14a10 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
14a20 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
14a30 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
14a40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14a50 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14a60 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
14a70 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
14a80 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
14a90 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
14aa0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14ab0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
14ac0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
14ad0 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
14ae0 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
14af0 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  et);.#endif.    
14b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14b10 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d   regFree1 = r1 =
14b20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
14b30 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
14b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14b50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14b60 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20  ger, 0, r1);.   
14b70 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
14b80 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14b90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14ba0 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
14bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14bc0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14bd0 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
14be0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14c00 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
14c10 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
14c20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
14c30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14c40 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
14c50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
14c60 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
14c70 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
14c80 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  BitNot );.      
14c90 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
14ca0 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  OP_Not );.      
14cb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14cc0 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
14cd0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14ce0 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
14cf0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
14d00 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14d10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
14d20 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
14d30 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14d40 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  e1==0 );.      i
14d50 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
14d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d70 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
14d80 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
14d90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14da0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
14db0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
14dc0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
14dd0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73  t addr;.      as
14de0 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
14df0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
14e00 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
14e10 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
14e20 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ll );.      test
14e30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
14e40 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
14e50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
14e60 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
14e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14e80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14e90 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
14ea0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
14eb0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14ec0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14ed0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
14ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14ef0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14f00 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
14f10 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
14f20 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
14f30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14f40 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
14f50 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  get, -1);.      
14f60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14f70 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
14f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14f90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
14fa0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
14fb0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66     AggInfo *pInf
14fc0 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
14fd0 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
14fe0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
14ff0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
15000 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15010 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
15020 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15030 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15040 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
15050 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20  gregate: %s()", 
15060 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
15070 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15080 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
15090 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
150a0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
150b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
150c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
150d0 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
150e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
150f0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
15100 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
15110 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
15120 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
15130 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
15140 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
15150 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15160 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
15170 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
15180 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
15190 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
151a0 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
151b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
151c0 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
151d0 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
151e0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
151f0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a   name in bytes *
15200 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
15210 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
15220 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
15230 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ame */.      int
15240 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
15250 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
15260 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
15270 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
15280 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
15290 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
152a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
152b0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ter */.      u8 
152c0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
152d0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
152e0 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
152f0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
15300 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
15310 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
15320 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
15330 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
15340 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15350 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15360 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15370 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15380 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46  ( op==TK_CONST_F
15390 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UNC );.      tes
153a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55  tcase( op==TK_FU
153b0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
153c0 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
153d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
153e0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
153f0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
15400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15410 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
15420 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
15430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
15440 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
15450 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
15460 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15470 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15480 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
15490 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
154a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
154b0 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71  ;.      nId = sq
154c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
154d0 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  d);.      pDef =
154e0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
154f0 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49  tion(db, zId, nI
15500 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
15510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
15520 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
15530 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15540 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
15550 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28   function: %.*s(
15560 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  )", nId, zId);. 
15570 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15580 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15590 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
155a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
155b0 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
155c0 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
155d0 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
155e0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
155f0 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
15600 73 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f  sary evalation o
15610 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d  f.      ** argum
15620 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69  ents past the fi
15630 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  rst non-NULL arg
15640 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
15650 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
15660 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
15670 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
15680 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
15690 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
156a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
156b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
156c0 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
156d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
156e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
156f0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
15700 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15710 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
15720 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
15730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15740 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
15750 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
15760 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
15770 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15780 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
15790 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b  rse, target, 1);
157a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
157b0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
157c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
157d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
157e0 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
157f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[i].pExpr, ta
15800 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
15810 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15820 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
15830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15850 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
15860 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
15870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15880 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 70   }...      if( p
15890 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
158a0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
158b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
158c0 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
158d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
158e0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20  ePush(pParse);  
158f0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
15900 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
15910 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15920 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
15930 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
15940 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
15950 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
15960 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20 2f 2a  pParse, 1);   /*
15970 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
15980 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
15990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
159a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
159b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
159c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
159d0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
159e0 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
159f0 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
15a00 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
15a10 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
15a20 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
15a30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15a40 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
15a50 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
15a60 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
15a70 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
15a80 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
15a90 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
15aa0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
15ab0 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
15ac0 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
15ad0 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
15ae0 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
15af0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
15b00 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
15b10 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
15b20 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
15b30 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
15b40 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
15b50 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
15b60 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
15b70 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
15b80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
15b90 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
15ba0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
15bb0 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
15bc0 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
15bd0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
15be0 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
15bf0 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
15c00 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
15c10 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
15c20 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
15c30 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
15c40 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
15c50 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
15c60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15c70 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
15c80 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
15c90 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
15ca0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
15cb0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
15cc0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
15cd0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
15ce0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
15cf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
15d00 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
15d10 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
15d20 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
15d30 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
15d40 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
15d50 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
15d60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  }.#endif.      f
15d70 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
15d80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
15d90 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
15da0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
15db0 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
15dc0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
15dd0 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31   constMask |= (1
15de0 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
15df0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
15e00 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
15e10 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
15e20 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
15e30 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
15e40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15e50 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
15e60 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
15e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15e80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
15e90 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
15ea0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
15eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15ec0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
15ed0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
15ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15ef0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15f00 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
15f10 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
15f20 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
15f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15f50 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63  , OP_Function, c
15f60 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
15f70 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
15f90 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
15fa0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
15fb0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15fc0 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
15fd0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
15fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15ff0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
16000 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
16010 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
16020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16030 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
16040 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
16050 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
16060 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
16070 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
16080 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16090 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
160a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
160b0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
160c0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
160d0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
160e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
160f0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
16100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16110 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
16120 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
16130 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16140 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
16150 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
16160 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16170 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
16180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16190 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
161a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
161b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
161c0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
161d0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
161e0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
161f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16200 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16210 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
16220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16230 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16240 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
16250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
16270 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
16280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16290 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
162a0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
162b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
162c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
162d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
162e0 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  */...    /*.    
162f0 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
16300 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
16310 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
16320 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
16330 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
16340 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
16350 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
16360 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
16370 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
16380 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
16390 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
163a0 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
163b0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
163c0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
163d0 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
163e0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
163f0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
16400 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
16410 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
16420 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16430 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
16440 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  ->x.pList->a;.  
16450 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
16460 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
16470 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  ;..      r1 = sq
16480 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16490 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
164a0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
164b0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
164c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
164d0 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
164e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
164f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
16500 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
16510 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
16520 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  =0 );.      r3 =
16530 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16540 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16550 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65    r4 = sqlite3Ge
16560 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16570 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
16580 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
16590 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
165a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
165b0 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20      r1, r2, r3, 
165c0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
165d0 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
165e0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
165f0 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
16600 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16610 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16620 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
16630 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16640 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16650 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
16660 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
16670 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16680 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
16690 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
166a0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
166b0 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
166c0 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
166d0 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  P2);.      sqlit
166e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
166f0 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
16700 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
16710 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16720 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
16730 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16740 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16750 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
16760 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16770 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
16780 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
16790 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
167a0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
167b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
167c0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
167d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
167e0 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
167f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16800 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
16810 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
16820 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
16830 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
16840 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
16850 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
16860 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
16870 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
16880 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
16890 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
168a0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
168b0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
168c0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
168d0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
168e0 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
168f0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
16900 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
16910 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
16920 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
16930 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
16940 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
16950 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
16960 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
16970 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
16980 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
16990 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
169a0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
169b0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
169c0 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
169d0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
169e0 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
169f0 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
16a00 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
16a10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
16a20 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
16a30 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
16a40 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
16a50 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
16a60 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
16a70 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
16a80 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
16a90 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
16aa0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
16ab0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
16ac0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
16ad0 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
16ae0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
16af0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
16b00 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
16b10 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
16b20 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
16b30 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
16b40 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
16b50 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
16b60 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
16b70 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
16b80 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
16b90 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
16ba0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
16bb0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
16bc0 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
16bd0 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
16be0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
16bf0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
16c00 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
16c10 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
16c20 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
16c30 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
16c40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
16c50 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
16c60 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
16c70 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
16c80 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
16c90 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
16ca0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
16cb0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
16cc0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
16cd0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
16ce0 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
16cf0 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
16d00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16d10 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
16d20 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
16d30 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
16d40 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
16d50 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
16d60 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
16d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16d80 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
16d90 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
16da0 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
16db0 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
16dc0 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
16dd0 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
16de0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
16df0 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
16e00 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
16e10 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
16e20 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
16e30 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
16e40 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
16e50 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
16e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16e70 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
16e80 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
16e90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
16ea0 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
16eb0 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
16ec0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
16ed0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
16ee0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
16ef0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
16f00 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
16f10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
16f20 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
16f30 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
16f40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16f50 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
16f60 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
16f70 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
16f80 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
16f90 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
16fa0 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
16fb0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
16fc0 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
16fd0 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
16fe0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
16ff0 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  l.  */.      if(
17000 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
17010 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
17020 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
17030 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
17040 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
17050 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
17060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17070 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
17080 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
17090 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
170a0 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
170b0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20     }...    /*.  
170c0 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
170d0 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
170e0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
170f0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
17100 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
17110 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
17120 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
17130 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
17140 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
17150 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
17160 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
17170 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
17180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
17190 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
171a0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
171b0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
171c0 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
171d0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
171e0 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
171f0 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
17200 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
17210 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
17220 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
17230 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
17240 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
17250 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
17260 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
17270 20 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67 68   in pExpr->pRigh
17280 74 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  t.  The Y is als
17290 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
172a0 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20  there is no.    
172b0 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20 61  ** ELSE clause a
172c0 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d  nd no other term
172d0 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20 74   matches, then t
172e0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
172f0 0a 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69 6f  .    ** exprssio
17300 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  n is NULL..    *
17310 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72  * Ei is in pExpr
17320 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20  ->pList->a[i*2] 
17330 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d  and Ri is pExpr-
17340 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d  >pList->a[i*2+1]
17350 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17360 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
17370 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
17380 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66  the Ri for the f
17390 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69  irst matching Ei
173a0 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74  ,.    ** or if t
173b0 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68  here is no match
173c0 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45  ing Ei, the ELSE
173d0 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74   term Y, or if t
173e0 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  here is.    ** n
173f0 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c  o ELSE term, NUL
17400 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  L..    */.    de
17410 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f  fault: assert( o
17420 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a  p==TK_CASE ); {.
17430 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62        int endLab
17440 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
17450 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
17460 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66  label for end of
17470 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20   CASE stmt */.  
17480 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65      int nextCase
17490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
174a0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
174b0 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45  bel for next WHE
174c0 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  N clause */.    
174d0 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20    int nExpr;    
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72      /* 2x number
17500 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
17510 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
17540 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
17550 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
17560 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
17570 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
17580 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
17590 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
175a0 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
175b0 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  lem;  /* Array o
175c0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
175d0 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d        Expr opCom
175e0 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  pare;           
175f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
17600 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20  ==Ei expression 
17610 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61  */.      Expr ca
17620 63 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20  cheX;           
17630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
17640 63 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  ched expression 
17650 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  X */.      Expr 
17660 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17680 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e  The X expression
17690 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
176a0 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pTest = 0;      
176b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
176c0 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72  ==Ei (form A) or
176d0 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42   just Ei (form B
176e0 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f  ) */.      VVA_O
176f0 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c  NLY( int iCacheL
17700 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
17710 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20  CacheLevel; ).. 
17720 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
17730 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17740 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
17750 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70  t) && pExpr->x.p
17760 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73  List );.      as
17770 73 65 72 74 28 28 70 45 78 70 72 2d 3e 78 2e 70  sert((pExpr->x.p
17780 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29  List->nExpr % 2)
17790 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73   == 0);.      as
177a0 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c  sert(pExpr->x.pL
177b0 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
177c0 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
177d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
177e0 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
177f0 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
17800 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
17810 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
17820 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  endLabel = sqlit
17830 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17840 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  v);.      if( (p
17850 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
17860 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
17870 63 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20  cacheX = *pX;.  
17880 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17890 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
178a0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  N );.        tes
178b0 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
178c0 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
178d0 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 54 61        cacheX.iTa
178e0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
178f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17900 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  , pX, &regFree1)
17910 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17920 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
17930 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
17940 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
17950 45 52 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ER;.        opCo
17960 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
17970 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
17980 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63  are.pLeft = &cac
17990 68 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  heX;.        pTe
179a0 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
179b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
179c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
179d0 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
179e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
179f0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
17a00 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
17a10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17a20 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
17a30 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
17a40 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
17a50 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
17a60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17a70 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
17a80 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
17a90 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
17aa0 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
17ab0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17ac0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17ad0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
17ae0 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
17af0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
17b00 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
17b10 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
17b20 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
17b30 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
17b40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
17b50 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
17b60 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
17b70 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MN );.        te
17b80 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
17b90 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
17ba0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
17bb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17bc0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
17bd0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
17be0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
17bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17c00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17c10 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65  Goto, 0, endLabe
17c20 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
17c30 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
17c40 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
17c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17c60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
17c70 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
17c80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
17c90 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
17ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17cb0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
17cc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17cd0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
17ce0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
17cf0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17d00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17d10 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
17d20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17d40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17d50 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
17d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17d70 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
17d80 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
17d90 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
17da0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
17db0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
17dc0 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
17dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17de0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
17df0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
17e00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
17e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17e20 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
17e30 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
17e40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17e50 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
17e60 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
17e70 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
17e80 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
17e90 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
17ea0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
17eb0 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
17ec0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
17ed0 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
17ee0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
17ef0 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
17f00 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
17f10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17f20 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
17f50 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
17f60 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
17f70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
17f80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
17f90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
17fa0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17fb0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
17fc0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
17fd0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
17fe0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
17ff0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
18000 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
18010 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
18020 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
18030 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
18040 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18050 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
18060 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
18070 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
18080 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
18090 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
180a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
180b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
180c0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
180d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 61 66 66 69  rse, pExpr->affi
180e0 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
180f0 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Token, 0);.     
18100 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   }..      break;
18110 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
18120 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
18130 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18140 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
18150 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18160 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18170 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
18180 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
18190 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
181a0 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
181b0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
181c0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
181d0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
181e0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
181f0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
18200 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
18210 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
18220 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
18230 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
18240 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
18250 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
18260 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
18270 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
18280 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
18290 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
182a0 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
182b0 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
182c0 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
182d0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
182e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
182f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
18300 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
18310 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  Reg){.  int r1 =
18320 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18330 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  eg(pParse);.  in
18340 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  t r2 = sqlite3Ex
18350 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
18360 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
18370 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b  .  if( r2==r1 ){
18380 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b  .    *pReg = r1;
18390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
183a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
183b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
183c0 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a  .    *pReg = 0;.
183d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
183e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
183f0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
18400 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
18410 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
18420 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
18430 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
18440 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
18450 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
18460 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
18470 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
18480 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rget..*/.int sql
18490 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
184a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
184b0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
184c0 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
184d0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
184e0 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
184f0 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
18500 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
18510 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18520 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
18530 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
18540 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
18550 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  e || pParse->db-
18560 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18570 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61  .  if( inReg!=ta
18580 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
18590 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c  pVdbe ){.    sql
185a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
185b0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
185c0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
185d0 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65  arget);.  }.  re
185e0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a  turn target;.}..
185f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
18600 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
18610 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
18620 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
18630 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
18640 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
18650 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
18660 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
18670 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
18680 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
18690 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
186a0 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
186b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
186c0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
186d0 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
186e0 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
186f0 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
18700 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
18710 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
18720 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
18730 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
18740 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
18750 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
18760 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
18770 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
18780 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
18790 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
187a0 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e  re reused..*/.in
187b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
187c0 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
187d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
187e0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
187f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
18800 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
18810 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52  int inReg;.  inR
18820 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
18830 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
18840 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61  pr, target);.  a
18850 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
18860 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  );.  /* This rou
18870 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
18880 6f 72 20 74 65 72 6d 73 20 74 6f 20 49 4e 53 45  or terms to INSE
18890 52 54 20 6f 72 20 55 50 44 41 54 45 2e 20 20 41  RT or UPDATE.  A
188a0 6e 64 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  nd the only.  **
188b0 20 6f 74 68 65 72 20 70 6c 61 63 65 20 77 68 65   other place whe
188c0 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  re expressions c
188d0 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  an be converted 
188e0 69 6e 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52  into TK_REGISTER
188f0 20 69 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52   is.  ** in WHER
18900 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
18910 69 6e 67 2e 20 20 53 6f 20 61 73 20 63 75 72 72  ing.  So as curr
18920 65 6e 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65  ently implemente
18930 64 2c 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  d, there is.  **
18940 20 6e 6f 20 77 61 79 20 66 6f 72 20 61 20 54 4b   no way for a TK
18950 5f 52 45 47 49 53 54 45 52 20 74 6f 20 65 78 69  _REGISTER to exi
18960 73 74 20 68 65 72 65 2e 20 20 42 75 74 20 69 74  st here.  But it
18970 20 73 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74   seems prudent t
18980 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 74 68 65 20  o.  ** keep the 
18990 41 4c 57 41 59 53 28 29 20 69 6e 20 63 61 73 65  ALWAYS() in case
189a0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
189b0 61 62 6f 76 65 20 63 68 61 6e 67 65 20 77 69 74  above change wit
189c0 68 20 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f  h future.  ** mo
189d0 64 69 66 69 63 61 74 69 6f 6e 73 20 6f 72 20 65  difications or e
189e0 6e 68 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a  nhancements. */.
189f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78    if( ALWAYS(pEx
18a00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
18a10 54 45 52 29 20 29 7b 20 20 0a 20 20 20 20 69 6e  TER) ){  .    in
18a20 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d  t iMem;.    iMem
18a30 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
18a40 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
18a50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18a60 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d  opy, inReg, iMem
18a70 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  );.    pExpr->iT
18a80 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20  able = iMem;.   
18a90 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45   pExpr->op2 = pE
18aa0 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78  xpr->op;.    pEx
18ab0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  pr->op = TK_REGI
18ac0 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  STER;.  }.  retu
18ad0 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
18ae0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
18af0 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f  f pExpr is an co
18b00 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
18b10 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  n that is approp
18b20 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63  riate.** for fac
18b30 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20  toring out of a 
18b40 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61  loop.  Appropria
18b50 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  te expressions a
18b60 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  re:.**.**    *  
18b70 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
18b80 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f  hat evaluates to
18b90 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63   two or more opc
18ba0 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  odes..**.**    *
18bb0 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72    Any OP_Integer
18bc0 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74  , OP_Real, OP_St
18bd0 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f  ring, OP_Blob, O
18be0 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20  P_Null, .**     
18bf0 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65    or OP_Variable
18c00 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
18c10 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64  eed to be placed
18c20 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20   in a .**       
18c30 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74 65  specific registe
18c40 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
18c50 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61  s no point in fa
18c60 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67  ctoring out sing
18c70 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  le-instruction c
18c80 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65  onstant.** expre
18c90 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64  ssions that need
18ca0 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e   to be placed in
18cb0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
18cc0 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20  gister.  .** We 
18cd0 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65  could factor the
18ce0 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20  m out, but then 
18cf0 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20  we would end up 
18d00 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f  adding an.** OP_
18d10 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f  SCopy instructio
18d20 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61  n to move the va
18d30 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  lue into the cor
18d40 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  rect register.**
18d50 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68   later.  We migh
18d60 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75  t as well just u
18d70 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
18d80 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a  instruction and.
18d90 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f  ** avoid the OP_
18da0 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  SCopy..*/.static
18db0 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61   int isAppropria
18dc0 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45  teForFactoring(E
18dd0 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21  xpr *p){.  if( !
18de0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
18df0 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20  stantNotJoin(p) 
18e00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
18e10 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61    /* Only consta
18e20 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  nt expressions a
18e30 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
18e40 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a  or factoring */.
18e50 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c    }.  if( (p->fl
18e60 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44 65  ags & EP_FixedDe
18e70 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  st)==0 ){.    re
18e80 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20  turn 1;  /* Any 
18e90 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74  constant without
18ea0 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
18eb0 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69  tion is appropri
18ec0 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69  ate */.  }.  whi
18ed0 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
18ee0 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65  LUS ) p = p->pLe
18ef0 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  ft;.  switch( p-
18f00 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  >op ){.#ifndef S
18f10 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
18f20 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
18f30 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66   TK_BLOB:.#endif
18f40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
18f50 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  IABLE:.    case 
18f60 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
18f70 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
18f80 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
18f90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
18fa0 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ING: {.      tes
18fb0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
18fc0 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74  _BLOB );.      t
18fd0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
18fe0 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20  TK_VARIABLE );. 
18ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19000 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
19010 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19020 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  se( p->op==TK_FL
19030 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  OAT );.      tes
19040 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
19050 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  _NULL );.      t
19060 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
19070 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20  TK_STRING );.   
19080 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73     /* Single-ins
19090 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e  truction constan
190a0 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64 20  ts with a fixed 
190b0 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a  destination are.
190c0 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
190d0 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49  done in-line.  I
190e0 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d  f we factor them
190f0 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74  , they will just
19100 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70   end.      ** up
19110 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f   generating an O
19120 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20  P_SCopy to move 
19130 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65  the value to the
19140 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20   destination.   
19150 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20     ** register. 
19160 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
19170 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  0;.    }.    cas
19180 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
19190 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
191a0 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
191b0 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  || p->pLeft->op=
191c0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
191d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
191e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
191f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19200 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
19210 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19220 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
19230 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
19240 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
19250 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
19260 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
19270 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75  .** factoring ou
19280 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65  t of a loop, the
19290 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65  n evaluate the e
192a0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74  xpression.** int
192b0 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
192c0 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
192d0 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54  ression into a T
192e0 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78  K_REGISTER.** ex
192f0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
19300 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73  tic int evalCons
19310 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57  tExpr(Walker *pW
19320 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
19330 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
19340 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
19350 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68  pParse;.  switch
19360 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
19370 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
19380 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
19390 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TER: {.      ret
193a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
193b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
193c0 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
193d0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
193e0 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
193f0 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20  _CONST_FUNC: {. 
19400 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75       /* The argu
19410 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74  ments to a funct
19420 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65 64  ion have a fixed
19430 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
19440 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d      ** Mark them
19450 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f   this way to avo
19460 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e  id generated unn
19470 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20  eeded OP_SCopy. 
19480 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
19490 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ions. .      */.
194a0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
194b0 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
194c0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73  .pList;.      as
194d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
194e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
194f0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
19500 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29       if( pList )
19510 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
19520 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
19530 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
19540 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19550 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a  tem = pList->a;.
19560 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e          for(; i>
19570 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
19580 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
19590 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70 45  ALWAYS(pItem->pE
195a0 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70 45  xpr) ) pItem->pE
195b0 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
195c0 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20  _FixedDest;.    
195d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
195e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
195f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70  .  }.  if( isApp
19600 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
19610 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20  ring(pExpr) ){. 
19620 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50     int r1 = ++pP
19630 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
19640 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d  int r2;.    r2 =
19650 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19660 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
19670 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
19680 66 28 20 4e 45 56 45 52 28 72 31 21 3d 72 32 29  f( NEVER(r1!=r2)
19690 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
196a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
196b0 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d   r1);.    pExpr-
196c0 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
196d0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
196e0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
196f0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
19700 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
19710 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
19720 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
19730 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
19740 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
19750 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
19760 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
19770 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
19780 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
19790 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
197a0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
197b0 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
197c0 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
197d0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
197e0 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
197f0 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
19800 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f  ed values..*/.vo
19810 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
19820 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
19830 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
19840 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
19850 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
19860 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e  llback = evalCon
19870 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c  stExpr;.  w.xSel
19880 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
19890 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
198a0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
198b0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
198c0 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  r);.}.../*.** Ge
198d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
198e0 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
198f0 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
19900 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
19910 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
19920 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
19930 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
19940 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
19950 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
19960 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19970 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
19980 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
19990 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
199a0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
199b0 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
199c0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
199d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
199e0 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
199f0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
19a00 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
19a10 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
19a20 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
19a30 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
19a40 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20  t doHardCopy    
19a50 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20   /* Make a hard 
19a60 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c  copy of every el
19a70 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  ement */.){.  st
19a80 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19a90 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
19aa0 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   i, n;.  assert(
19ab0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
19ac0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
19ad0 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  );.  n = pList->
19ae0 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
19af0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
19b00 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
19b10 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
19b20 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20  tem->iAlias ){. 
19b30 20 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20       int iReg = 
19b40 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65  codeAlias(pParse
19b50 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c  , pItem->iAlias,
19b60 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
19b70 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
19b80 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
19b90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 65 67  ;.      if( iReg
19bb0 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
19bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19bd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
19be0 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65  opy, iReg, targe
19bf0 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+i);.      }.  
19c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
19c10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
19c20 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
19c30 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
19c40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
19c50 48 61 72 64 43 6f 70 79 20 26 26 20 21 70 50 61  HardCopy && !pPa
19c60 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19c70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
19c80 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
19c90 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  py(pParse, targe
19ca0 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, n);.    }.  }
19cb0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
19cc0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
19cd0 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
19ce0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
19cf0 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
19d00 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
19d10 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
19d20 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
19d30 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
19d40 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
19d50 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
19d60 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
19d70 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
19d80 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f  n.** elementatio
19d90 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69  n of x..*/.stati
19da0 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
19db0 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
19dc0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
19dd0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
19de0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19df0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
19e00 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
19e10 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
19e20 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
19e30 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
19e40 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a  mp here if the j
19e50 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  ump is taken */.
19e60 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65    int jumpIfTrue
19e70 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20  ,   /* Take the 
19e80 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
19e90 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  EEN is true */. 
19ea0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
19eb0 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
19ec0 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
19ed0 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
19ee0 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  .  Expr exprAnd;
19ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
19f00 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
19f10 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
19f20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
19f30 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
19f40 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
19f50 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
19f60 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
19f70 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b  */.  Expr exprX;
19f80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78         /* The  x
19f90 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20    subexpression 
19fa0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
19fb0 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
19fc0 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
19fd0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
19fe0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19ff0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1a000 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
1a010 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
1a020 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
1a030 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
1a040 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
1a050 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
1a060 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
1a070 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
1a080 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
1a090 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
1a0a0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
1a0b0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
1a0c0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1a0d0 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
1a0e0 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
1a0f0 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
1a100 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
1a110 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
1a120 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1a130 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
1a140 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
1a150 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1a160 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
1a170 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78  &regFree1);.  ex
1a180 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
1a190 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70  STER;.  if( jump
1a1a0 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71  IfTrue ){.    sq
1a1b0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1a1c0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1a1d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1a1e0 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
1a1f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1a200 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
1a210 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1a220 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
1a230 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a240 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a250 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
1a260 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
1a270 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
1a280 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a290 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1a2a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1a2b0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1a2c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a2d0 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1a2e0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1a2f0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1a300 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a310 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1a320 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1a330 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1a340 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1a350 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1a360 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1a370 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a380 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1a390 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1a3a0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1a3b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1a3c0 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1a3d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1a3e0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1a3f0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a400 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1a410 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1a420 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1a430 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1a440 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1a450 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1a460 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=0 );.}../*.**
1a470 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1a480 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1a490 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1a4a0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1a4b0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1a4c0 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1a4d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
1a4e0 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1a4f0 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1a500 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1a510 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1a520 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
1a530 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1a540 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1a550 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1a560 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
1a570 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
1a580 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
1a590 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
1a5a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
1a5b0 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
1a5c0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1a5d0 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
1a5e0 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
1a5f0 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
1a600 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
1a610 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
1a620 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
1a630 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
1a640 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
1a650 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
1a660 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
1a670 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
1a680 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
1a690 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
1a6a0 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
1a6b0 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
1a6c0 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
1a6d0 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
1a6e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1a6f0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
1a700 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
1a710 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1a720 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
1a730 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1a740 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1a750 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1a760 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1a770 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1a780 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1a790 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1a7a0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1a7b0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1a7c0 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1a7d0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1a7e0 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1a7f0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1a800 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1a810 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
1a820 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
1a830 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1a840 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
1a850 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
1a860 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
1a870 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
1a880 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
1a890 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
1a8a0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1a8b0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1a8c0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1a8d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a8e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a8f0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1a900 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a910 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a920 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1a930 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1a940 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a950 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
1a960 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1a970 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1a980 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1a990 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a9a0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1a9b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1a9c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a9d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
1a9e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a9f0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1aa00 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
1aa10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1aa20 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
1aa30 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1aa40 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1aa50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1aa60 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1aa70 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1aa80 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1aa90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1aaa0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1aab0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1aac0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1aad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aae0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1aaf0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1ab00 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1ab10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ab20 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1ab30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ab40 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1ab50 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1ab60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ab70 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1ab80 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1ab90 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1aba0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1abb0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1abc0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1abd0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1abe0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
1abf0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
1ac00 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
1ac10 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
1ac20 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
1ac30 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
1ac40 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
1ac50 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
1ac60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ac70 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
1ac80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ac90 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
1aca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1acb0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
1acc0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1acd0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
1ace0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1acf0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
1ad00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
1ad10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ad20 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
1ad30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ad40 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ad50 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1ad60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ad70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ad80 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1ad90 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1ada0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1adb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1adc0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1add0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1ade0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1adf0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1ae00 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1ae30 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ae40 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1ae50 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1ae60 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ae70 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ae80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ae90 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1aea0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1aeb0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1aec0 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
1aed0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1aee0 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1aef0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1af00 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1af10 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1af20 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1af30 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1af40 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1af50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1af60 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1af70 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
1af80 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1af90 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1afa0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1afb0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1afc0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1afd0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1afe0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1aff0 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  est, SQLITE_NULL
1b000 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
1b010 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1b020 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b030 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1b040 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b050 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b060 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1b070 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1b080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1b090 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
1b0a0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
1b0b0 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1b0c0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1b0d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1b0e0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1b0f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b100 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1b110 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1b120 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1b130 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1b140 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1b150 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b160 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1b170 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1b180 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1b190 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1b1a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b1b0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1b1c0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1b1d0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1b1e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1b1f0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1b200 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1b210 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1b220 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b230 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1b240 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
1b250 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
1b260 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b270 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
1b280 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
1b290 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
1b2a0 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
1b2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b2c0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1b2d0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1b2e0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1b2f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b300 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1b310 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
1b320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b330 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1b340 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b350 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b360 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1b370 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1b380 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1b390 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
1b3a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1b3b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b3c0 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
1b3d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1b3e0 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
1b3f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1b400 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1b410 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1b420 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1b430 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
1b440 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1b450 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1b460 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1b470 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b480 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1b490 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
1b4a0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1b4b0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1b4c0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1b4d0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1b4e0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1b4f0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1b500 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
1b510 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1b520 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1b530 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1b540 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1b550 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
1b560 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1b570 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1b580 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1b590 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
1b5a0 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
1b5b0 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
1b5c0 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
1b5d0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
1b5e0 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
1b5f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b600 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
1b610 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1b620 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1b630 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1b640 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b650 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1b660 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1b670 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1b680 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1b690 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1b6a0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1b6b0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1b6c0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1b6d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1b6e0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1b6f0 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
1b700 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ance of VDBE che
1b710 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1b720 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
1b730 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
1b740 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1b750 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
1b760 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
1b770 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1b780 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
1b790 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
1b7a0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
1b7b0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
1b7c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
1b7d0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
1b7e0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
1b7f0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1b800 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
1b810 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
1b820 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
1b830 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
1b840 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1b860 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
1b870 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
1b880 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
1b890 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
1b8a0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
1b8b0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
1b8c0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
1b8d0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1b8f0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
1b900 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
1b910 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
1b920 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
1b930 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
1b940 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
1b950 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1b960 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
1b970 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
1b980 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
1b990 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
1b9a0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1b9b0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
1b9c0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
1b9d0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
1b9e0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
1b9f0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
1ba00 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
1ba10 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
1ba20 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
1ba30 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
1ba40 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
1ba50 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1ba60 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
1ba70 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1ba80 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
1ba90 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1baa0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1bab0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
1bac0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
1bad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1bae0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
1baf0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
1bb00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1bb10 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
1bb20 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
1bb30 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1bb40 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
1bb50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1bb60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
1bb70 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
1bb80 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1bb90 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
1bba0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
1bbb0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1bbc0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
1bbd0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
1bbe0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1bbf0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1bc00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bc10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1bc20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bc30 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1bc40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1bc50 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1bc60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bc70 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1bc80 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1bc90 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1bca0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1bcb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bcc0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1bcd0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1bce0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1bcf0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bd00 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1bd10 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1bd20 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1bd30 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1bd40 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1bd50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bd60 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
1bd70 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1bd80 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1bd90 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1bda0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1bdb0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1bdc0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1bdd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1bde0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1bdf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1be00 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1be10 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1be20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1be30 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1be40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1be50 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1be60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1be70 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1be80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1be90 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1bea0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1beb0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1bec0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1bed0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1bee0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1bef0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1bf00 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1bf10 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
1bf20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
1bf30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bf40 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
1bf50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1bf60 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
1bf70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1bf80 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
1bf90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1bfa0 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
1bfb0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
1bfc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bfd0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1bfe0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1bff0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c000 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1c010 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1c020 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1c030 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1c040 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1c050 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1c060 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1c070 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1c080 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1c090 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1c0a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c0b0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1c0c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1c0d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1c0e0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1c0f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1c100 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1c110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c120 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1c130 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1c140 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1c150 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1c160 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1c170 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1c180 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1c190 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1c1a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1c1b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1c1c0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1c1d0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1c1e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1c1f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1c200 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1c210 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
1c220 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
1c230 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
1c240 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1c250 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1c260 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1c270 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1c290 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1c2a0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1c2b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1c2c0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1c2d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1c2e0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1c2f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c300 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1c310 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1c320 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74  TNULL: {.      t
1c330 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1c340 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1c350 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1c360 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1c370 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1c380 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1c390 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1c3a0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1c3b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c3c0 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1c3d0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1c3e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1c3f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1c400 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c410 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1c420 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c430 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1c440 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1c450 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1c460 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a  Expr, dest, 0, j
1c470 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1c480 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c490 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1c4a0 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
1c4b0 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
1c4c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c4d0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1c4e0 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
1c4f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c500 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1c510 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
1c520 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1c530 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c540 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1c550 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
1c560 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1c570 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1c580 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1c590 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1c5a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1c5b0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1c5c0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
1c5d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c5e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1c5f0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1c600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c610 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
1c620 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
1c630 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
1c640 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1c650 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1c660 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1c670 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1c680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c690 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1c6a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c6b0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
1c6c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c6d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c6e0 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
1c6f0 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
1c700 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
1c710 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
1c720 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
1c730 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
1c740 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
1c750 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
1c760 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
1c770 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
1c780 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
1c790 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
1c7a0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
1c7b0 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
1c7c0 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
1c7d0 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
1c7e0 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
1c7f0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53  perator..**.** S
1c800 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
1c810 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c820 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
1c830 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
1c840 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
1c850 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
1c860 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
1c870 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
1c880 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
1c890 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
1c8a0 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
1c8b0 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
1c8c0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
1c8d0 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
1c8e0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
1c8f0 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
1c900 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
1c910 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1c920 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
1c930 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
1c940 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
1c950 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
1c960 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1c970 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
1c980 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
1c990 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1c9a0 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
1c9b0 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
1c9c0 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
1c9d0 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
1c9e0 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
1c9f0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
1ca00 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
1ca10 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
1ca20 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
1ca30 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
1ca40 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1ca50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1ca60 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
1ca70 72 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41  r *pB){.  if( pA
1ca80 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
1ca90 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
1caa0 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61  ? 0 : 2;.  }.  a
1cab0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1cac0 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  nyProperty(pA, E
1cad0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1cae0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73  educed) );.  ass
1caf0 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1cb00 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1cb10 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1cb20 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45  uced) );.  if( E
1cb30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1cb40 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  A, EP_xIsSelect)
1cb50 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
1cb60 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65  rty(pB, EP_xIsSe
1cb70 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
1cb80 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
1cb90 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1cba0 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
1cbb0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
1cbc0 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32  inct) ) return 2
1cbd0 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  ;.  if( pA->op!=
1cbe0 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
1cbf0 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  2;.  if( sqlite3
1cc00 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1cc10 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
1cc20 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1cc30 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1cc40 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
1cc50 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
1cc60 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1cc70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1cc80 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
1cc90 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
1cca0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1ccb0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
1ccc0 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
1ccd0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
1cce0 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
1ccf0 32 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  2;.  if( ExprHas
1cd00 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1cd10 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  IntValue) ){.   
1cd20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
1cd30 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74  perty(pB, EP_Int
1cd40 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e  Value) || pA->u.
1cd50 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56  iValue!=pB->u.iV
1cd60 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
1cd70 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1cd80 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70  }else if( pA->op
1cd90 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
1cda0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
1cdb0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1cdc0 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e  operty(pB, EP_In
1cdd0 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52  tValue) || NEVER
1cde0 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30  (pB->u.zToken==0
1cdf0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1ce00 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1ce10 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
1ce20 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
1ce30 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1ce40 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
1ce50 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
1ce60 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
1ce70 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
1ce80 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29  EP_ExpCollate) )
1ce90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1cea0 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1ceb0 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20  _ExpCollate)!=0 
1cec0 26 26 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42  && pA->pColl!=pB
1ced0 2d 3e 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e  ->pColl ) return
1cee0 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   2;.  return 0;.
1cef0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1cf00 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
1cf10 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
1cf20 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
1cf30 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
1cf40 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
1cf50 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
1cf60 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1cf70 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
1cf80 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
1cf90 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
1cfa0 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
1cfb0 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
1cfc0 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
1cfd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
1cfe0 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
1cff0 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
1d000 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
1d010 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
1d020 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
1d030 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
1d040 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
1d050 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
1d060 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
1d070 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
1d080 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
1d090 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
1d0a0 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
1d0b0 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
1d0c0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1d0d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d0e0 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
1d0f0 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
1d100 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
1d110 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d  if( pA==0 && pB=
1d120 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1d130 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
1d140 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1d150 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21    if( pA->nExpr!
1d160 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  =pB->nExpr ) ret
1d170 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 1;.  for(i=0
1d180 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69  ; i<pA->nExpr; i
1d190 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1d1a0 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d  ExprA = pA->a[i]
1d1b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
1d1c0 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61   *pExprB = pB->a
1d1d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
1d1e0 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74  f( pA->a[i].sort
1d1f0 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e  Order!=pB->a[i].
1d200 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
1d210 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 1;.    if( sq
1d220 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1d230 28 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29  (pExprA, pExprB)
1d240 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
1d250 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1d260 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1d270 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
1d280 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1d290 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
1d2a0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1d2b0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
1d2c0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
1d2d0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
1d2e0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
1d2f0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
1d300 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
1d310 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
1d320 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
1d330 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
1d340 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
1d350 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
1d360 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
1d370 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
1d380 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
1d390 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
1d3a0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
1d3b0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
1d3c0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
1d3d0 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
1d3e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
1d3f0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
1d400 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1d410 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
1d420 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
1d430 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1d440 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
1d450 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
1d460 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1d470 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
1d480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d490 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
1d4a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
1d4b0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
1d4c0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
1d4d0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
1d4e0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1d4f0 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
1d500 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
1d510 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
1d520 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
1d530 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
1d540 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
1d550 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
1d560 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
1d570 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
1d580 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
1d590 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
1d5a0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
1d5b0 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
1d5c0 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
1d5d0 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
1d5e0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1d5f0 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
1d600 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1d610 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
1d620 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1d630 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
1d640 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
1d650 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
1d660 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
1d670 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
1d680 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
1d690 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
1d6a0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
1d6b0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
1d6c0 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
1d6d0 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
1d6e0 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
1d6f0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
1d700 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
1d710 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1d720 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1d730 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
1d740 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
1d750 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
1d760 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1d770 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1d780 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d790 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1d7a0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1d7b0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1d7c0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
1d7d0 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
1d7e0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
1d7f0 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
1d800 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
1d810 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
1d820 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
1d830 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  cList!=0) ){.   
1d840 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1d850 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1d860 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
1d870 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1d880 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
1d890 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1d8a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
1d8b0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1d8c0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Col;.          a
1d8d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1d8e0 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
1d8f0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1d900 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
1d910 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1d920 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
1d930 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
1d940 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1d950 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1d960 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
1d970 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
1d980 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
1d990 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
1d9a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1d9b0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
1d9c0 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
1d9d0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
1d9e0 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
1d9f0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
1da00 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
1da10 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
1da20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
1da30 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
1da40 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
1da50 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
1da60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1da70 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
1da80 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
1da90 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
1daa0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
1dab0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1dac0 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
1dad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1dae0 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
1daf0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
1db00 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1db10 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
1db20 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
1db30 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
1db40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1db50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1db60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1db70 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
1db80 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
1db90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
1dba0 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
1dbb0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
1dbc0 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
1dbd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
1dbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1dbf0 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1dc00 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
1dc10 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
1dc20 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
1dc30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dc40 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
1dc50 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1dc70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
1dc80 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1dc90 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1dca0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1dcb0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
1dcc0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1dcd0 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1dcf0 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
1dd00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dd10 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
1dd20 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
1dd30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
1dd40 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
1dd50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
1dd60 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
1dd70 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
1dd80 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
1dd90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
1dda0 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
1ddc0 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1dde0 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
1ddf0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1de10 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
1de20 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1de30 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
1de40 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1de50 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
1de60 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
1de90 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
1dea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1deb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1dec0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1df10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1df20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1df30 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
1df40 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1df50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1df60 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
1df70 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
1df80 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
1df90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1dfa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dfb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
1dfc0 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
1dfd0 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
1dfe0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
1dff0 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
1e000 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
1e010 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
1e020 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
1e030 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
1e040 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
1e050 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
1e060 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
1e070 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
1e080 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
1e090 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
1e0a0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
1e0b0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1e0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
1e0d0 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
1e0e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1e0f0 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
1e100 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
1e110 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1e120 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
1e130 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
1e140 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
1e150 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
1e160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e170 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
1e180 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1e190 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
1e1a0 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
1e1b0 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
1e1c0 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
1e1d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1e1e0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1e1f0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1e200 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1e210 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65   /* The pNC->nDe
1e220 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73  pth==0 test caus
1e230 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1e240 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65  ctions in subque
1e250 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ries.      ** to
1e260 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20   be ignored */. 
1e270 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
1e280 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
1e290 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1e2a0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
1e2b0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
1e2c0 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
1e2d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
1e2e0 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
1e2f0 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
1e300 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
1e310 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e320 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1e330 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
1e340 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
1e350 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1e360 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1e370 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
1e380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e390 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1e3a0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
1e3b0 2c 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20  , pExpr)==0 ){. 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1e3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e3f0 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
1e400 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
1e410 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
1e420 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
1e430 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
1e440 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
1e450 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1e460 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
1e470 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
1e480 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
1e490 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
1e4a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
1e4b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
1e4c0 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
1e4d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e4e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e4f0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1e500 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
1e510 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
1e520 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
1e530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1e540 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
1e550 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1e560 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
1e570 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1e580 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e590 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e5a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e5b0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e5c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
1e5d0 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
1e5e0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
1e5f0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
1e600 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
1e610 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33  .zToken, sqlite3
1e620 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
1e630 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20  u.zToken),.     
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e650 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
1e660 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1e670 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
1e680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1e690 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
1e6a0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
1e6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1e6c0 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
1e6d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1e6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1e6f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1e700 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
1e710 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
1e720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e730 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1e740 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
1e750 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
1e760 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
1e770 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
1e780 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
1e790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e7a0 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
1e7b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
1e7c0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1e7d0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
1e7e0 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
1e7f0 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
1e800 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
1e810 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
1e820 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
1e830 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
1e840 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1e850 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
1e860 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e870 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1e880 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
1e890 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
1e8a0 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
1e8b0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1e8c0 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43  Select){.  NameC
1e8d0 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
1e8e0 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
1e8f0 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
1e900 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e  =0 ){.    pNC->n
1e910 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c  Depth++;.    sql
1e920 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1e930 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29  Walker, pSelect)
1e940 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  ;.    pNC->nDept
1e950 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h--;.    return 
1e960 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c  WRC_Prune;.  }el
1e970 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  se{.    return W
1e980 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
1e990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
1e9a0 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
1e9b0 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
1e9c0 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
1e9d0 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
1e9e0 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
1e9f0 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
1ea00 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
1ea10 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
1ea20 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
1ea30 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
1ea40 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1ea50 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
1ea60 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
1ea70 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
1ea80 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
1ea90 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
1eaa0 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
1eab0 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
1eac0 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
1ead0 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
1eae0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1eaf0 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
1eb00 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
1eb10 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
1eb20 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
1eb30 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
1eb40 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
1eb50 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1eb60 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
1eb70 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
1eb80 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
1eb90 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
1eba0 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
1ebb0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
1ebc0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
1ebd0 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
1ebe0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1ebf0 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
1ec00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
1ec10 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1ec20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
1ec30 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1ec40 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
1ec50 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
1ec60 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
1ec70 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
1ec80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
1ec90 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
1eca0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1ecb0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1ecc0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1ecd0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1ece0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1ecf0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1ed00 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1ed10 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1ed20 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
1ed30 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1ed40 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1ed50 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
1ed60 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
1ed70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1ed80 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
1ed90 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
1eda0 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
1edb0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
1edc0 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
1edd0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1ede0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1edf0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
1ee00 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
1ee10 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
1ee20 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
1ee30 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
1ee40 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
1ee50 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
1ee60 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
1ee70 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
1ee80 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
1ee90 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
1eea0 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
1eeb0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
1eec0 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
1eed0 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
1eee0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1eef0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61  , then.** the da
1ef00 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
1ef10 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
1ef20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
1ef30 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
1ef40 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
1ef50 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
1ef60 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
1ef70 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
1ef80 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1ef90 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
1efa0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1efb0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
1efc0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
1efd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1efe0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1eff0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
1f000 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1f010 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1f020 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1f030 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1f040 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1f050 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
1f060 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
1f070 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1f080 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
1f090 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1f0a0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1f0b0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
1f0c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
1f0d0 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
1f0e0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
1f0f0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
1f100 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
1f110 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
1f120 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1f130 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
1f140 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
1f150 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
1f160 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
1f170 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
1f180 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
1f190 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
1f1a0 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
1f1b0 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
1f1c0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
1f1d0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
1f1e0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1f1f0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
1f200 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
1f210 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
1f220 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1f230 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
1f240 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
1f250 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
1f260 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1f270 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
1f280 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
1f290 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1f2a0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
1f2b0 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
1f2c0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1f2d0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
1f2e0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
1f2f0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
1f300 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
1f310 0a 20 20 7d 0a 7d 0a                             .  }.}.