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

Artifact 26dc693216dfafbdde18de2269cc00a627b7807b:


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 74 68 65 20 6f 70   Generate the op
1be0: 65 72 61 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d  erands for a com
1bf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
1c00: 6e 2e 20 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65  n.  Before.** ge
1c10: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
1c20: 65 20 66 6f 72 20 65 61 63 68 20 6f 70 65 72 61  e for each opera
1c30: 6e 64 2c 20 73 65 74 20 74 68 65 20 45 50 5f 41  nd, set the EP_A
1c40: 6e 79 41 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e  nyAff.** flag on
1c50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c60: 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1c70: 62 65 20 61 62 6c 65 20 74 6f 20 75 73 65 64 20  be able to used 
1c80: 61 0a 2a 2a 20 63 61 63 68 65 64 20 63 6f 6c 75  a.** cached colu
1c90: 6d 6e 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  mn value that ha
1ca0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 64  s previously und
1cb0: 65 72 67 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66  ergone an.** aff
1cc0: 69 6e 69 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f  inity change..*/
1cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1ce0: 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
1cf0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d00: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1d10: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1d20: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1d30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
1d40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1d50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1d60: 20 2a 70 52 65 67 4c 65 66 74 2c 20 20 20 20 2f   *pRegLeft,    /
1d70: 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72 65  * Register where
1d80: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 69 73   left operand is
1d90: 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74   stored */.  int
1da0: 20 2a 70 46 72 65 65 4c 65 66 74 2c 20 20 20 2f   *pFreeLeft,   /
1db0: 2a 20 46 72 65 65 20 74 68 69 73 20 72 65 67 69  * Free this regi
1dc0: 73 74 65 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a  ster when done *
1dd0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
1de0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
1df0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
1e00: 69 6e 74 20 2a 70 52 65 67 52 69 67 68 74 2c 20  int *pRegRight, 
1e10: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 77 68    /* Register wh
1e20: 65 72 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  ere right operan
1e30: 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20  d is stored */. 
1e40: 20 69 6e 74 20 2a 70 46 72 65 65 52 69 67 68 74   int *pFreeRight
1e50: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 65 6d 70     /* Write temp
1e60: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 69   register for ri
1e70: 67 68 74 20 6f 70 65 72 61 6e 64 20 74 68 65 72  ght operand ther
1e80: 65 20 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28  e */.){.  while(
1e90: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55   pLeft->op==TK_U
1ea0: 50 4c 55 53 20 29 20 70 4c 65 66 74 20 3d 20 70  PLUS ) pLeft = p
1eb0: 4c 65 66 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70  Left->pLeft;.  p
1ec0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
1ed0: 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65  P_AnyAff;.  *pRe
1ee0: 67 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  gLeft = sqlite3E
1ef0: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f00: 73 65 2c 20 70 4c 65 66 74 2c 20 70 46 72 65 65  se, pLeft, pFree
1f10: 4c 65 66 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  Left);.  while( 
1f20: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55  pRight->op==TK_U
1f30: 50 4c 55 53 20 29 20 70 52 69 67 68 74 20 3d 20  PLUS ) pRight = 
1f40: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20  pRight->pLeft;. 
1f50: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c   pRight->flags |
1f60: 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a  = EP_AnyAff;.  *
1f70: 70 52 65 67 52 69 67 68 74 20 3d 20 73 71 6c 69  pRegRight = sqli
1f80: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f90: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1fa0: 70 46 72 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a  pFreeRight);.}..
1fb0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1fc0: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1fd0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1fe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1ff0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
2000: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
2010: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
2020: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
2030: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2040: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2050: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2060: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2070: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2080: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2090: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
20a0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
20b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
20c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
20d0: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
20e0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
20f0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
2100: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
2110: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
2120: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
2130: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2140: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2150: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2160: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2170: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2180: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2190: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
21a0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
21b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
21c0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
21d0: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
21e0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
21f0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
2200: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2210: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
2220: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
2230: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2260: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2270: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2280: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2290: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
22a0: 29 3b 0a 20 20 69 66 28 20 28 70 35 20 26 20 53  );.  if( (p5 & S
22b0: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 29 21  QLITE_AFF_MASK)!
22c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
22d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
22e0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
22f0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
2300: 6e 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  n1, 1);.    sqli
2310: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
2320: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
2330: 65 2c 20 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a  e, in2, 1);.  }.
2340: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2350: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
2360: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
2370: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
2380: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
2390: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
23a0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
23b0: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
23c0: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
23d0: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
23e0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
23f0: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
2400: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
2410: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2420: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
2430: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
2440: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2450: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
2460: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
2470: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2480: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
2490: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
24a0: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
24b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24c0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
24d0: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
24e0: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
24f0: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
2500: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
2510: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
2520: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2530: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2540: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2550: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2560: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
2570: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
2580: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
2590: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
25a0: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
25b0: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
25c0: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
25d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
25e0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
25f0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
2600: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
2610: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
2620: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
2630: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
2640: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
2650: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
2660: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
2670: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
2680: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
2690: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
26a0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
26b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
26c0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
26d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
26e0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
26f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
2700: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
2710: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
2720: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
2730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
2740: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
2750: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
2760: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
2770: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
2780: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
27a0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
27b0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
27c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
27d0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
27e0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
27f0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2800: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
2810: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2820: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
2830: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
2840: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2850: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2860: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
2870: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2880: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
2890: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
28a0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
28b0: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
28c0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
28d0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
28e0: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
28f0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2900: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
2910: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2920: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2930: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
2940: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2950: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2960: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
2970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2980: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
2990: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
29a0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29b0: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
29c0: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
29d0: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
29e0: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
29f0: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
2a00: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
2a10: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
2a20: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
2a30: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
2a40: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
2a50: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
2a60: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
2a70: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
2a80: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
2a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2aa0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ab0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2ac0: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2ad0: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2ae0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2af0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2b00: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2b10: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2b20: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2b30: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2b40: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2b50: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2b60: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
2b70: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2b80: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
2b90: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   &nHeight);.  }.
2ba0: 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e    p->nHeight = n
2bb0: 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f  Height + 1;.}../
2bc0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2bd0: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2be0: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78 70  le using the exp
2bf0: 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75 6e  rSetHeight() fun
2c00: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65  ction. If.** the
2c10: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2c20: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69  er than the maxi
2c30: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72  mum allowed expr
2c40: 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a  ession depth,.**
2c50: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2c60: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
2c70: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
2c80: 74 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  tHeight(Parse *p
2c90: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
2ca0: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
2cb0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
2cc0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
2cd0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
2ce0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2cf0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
2d00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
2d10: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
2d20: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
2d30: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
2d40: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
2d50: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
2d60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2d70: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
2d80: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2d90: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2da0: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
2db0: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
2dc0: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
2dd0: 0a 20 20 23 64 65 66 69 6e 65 20 65 78 70 72 53  .  #define exprS
2de0: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
2df0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
2e00: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
2e10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2e20: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
2e30: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
2e40: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
2e50: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
2e60: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2e70: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
2e80: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
2e90: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
2ea0: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
2eb0: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
2ec0: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
2ed0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
2ee0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2ef0: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
2f00: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2f10: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
2f20: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2f30: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
2f40: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
2f50: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
2f60: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
2f70: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
2f80: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
2f90: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
2fa0: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
2fb0: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
2fc0: 73 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20  s performance.  
2fd0: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
2fe0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
2ff0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
3000: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
3010: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
3020: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
3030: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
3040: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
3050: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
3060: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
3070: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
3080: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
3090: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
30a0: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
30b0: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
30c0: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
30d0: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
30e0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
30f0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
3100: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
3110: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
3120: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
3130: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
3140: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
3150: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
3160: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
3170: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
3180: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
3190: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
31a0: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
31b0: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
31c0: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
31d0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
31e0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
31f0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
3200: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3210: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
3220: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3230: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
3240: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
3250: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
3260: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
3270: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
3280: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3290: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
32a0: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
32b0: 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65  oken,    /* Toke
32c0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
32d0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
32e0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3300: 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b  to dequote */.){
3310: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3320: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
3330: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20  .  int iValue = 
3340: 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  0;..  if( pToken
3350: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
3360: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
3370: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
3380: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
3390: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
33a0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
33b0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
33c0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
33d0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
33e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
33f0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3400: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
3410: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3420: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3430: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3440: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3450: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3460: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3470: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3480: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
3490: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
34a0: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
34b0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
34c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
34d0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
34e0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
34f0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
3500: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
3510: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3520: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3530: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3540: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
3550: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
3560: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
3570: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
3580: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
3590: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
35a0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
35b0: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
35c0: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
35d0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
35e0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
35f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3600: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3610: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3620: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3630: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3640: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
3650: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
3660: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
3670: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
3680: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
3690: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
36a0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
36b0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
36c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
36d0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
36e0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
36f0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3700: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3710: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3720: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3730: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3740: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
3750: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
3760: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
3770: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
3780: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
3790: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
37a0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
37b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
37c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
37d0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
37e0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
37f0: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3800: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3810: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3820: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3830: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
3850: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3860: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
3870: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
3880: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
3890: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
38a0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
38b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
38c0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
38d0: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
38e0: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
38f0: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3900: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3910: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3920: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3930: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3940: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3950: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3960: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3970: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
3980: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
3990: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
39a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
39b0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
39c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
39d0: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
39e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
39f0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3a00: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3a10: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69   pRight;.      i
3a20: 66 28 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  f( pRight->flags
3a30: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   ){.        pRoo
3a50: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  t->flags |= EP_E
3a60: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
3a70: 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20     pRoot->pColl 
3a80: 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b  = pRight->pColl;
3a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3aa0: 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a     if( pLeft ){.
3ab0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65        pRoot->pLe
3ac0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  ft = pLeft;.    
3ad0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61    if( pLeft->fla
3ae0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
3af0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  te ){.        pR
3b00: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
3b10: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
3b20: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c       pRoot->pCol
3b30: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
3b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3b50: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
3b60: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
3b70: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
3b80: 61 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  a Expr node whic
3b90: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
3ba0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
3bb0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
3bc0: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
3bd0: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
3be0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3bf0: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
3c00: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
3c10: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
3c20: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
3c30: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
3c40: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
3c50: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
3c60: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
3c70: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
3c80: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
3c90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3ca0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3cb0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3cd0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3ce0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
3cf0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
3d00: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
3d10: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
3d20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
3d30: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
3d40: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
3d50: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
3d60: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
3d70: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
3d80: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
3d90: 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70  Parse->db, op, p
3da0: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 73 71 6c  Token, 1);.  sql
3db0: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
3dc0: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
3dd0: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
3de0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ght);.  return p
3df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
3e00: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
3e10: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
3e20: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
3e30: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
3e40: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
3e50: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
3e60: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
3e70: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3e80: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
3e90: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
3ea0: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
3eb0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
3ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
3ed0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
3ee0: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
3ef0: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
3f00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78  .  }else{.    Ex
3f10: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
3f20: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
3f30: 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20  TK_AND, 0, 0);. 
3f40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
3f50: 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c  tachSubtrees(db,
3f60: 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52   pNew, pLeft, pR
3f70: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
3f80: 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n pNew;.  }.}../
3f90: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
3fa0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3fb0: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
3fc0: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
3fd0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
3fe0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3ff0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72  ExprFunction(Par
4000: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
4010: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
4020: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
4030: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c  xpr *pNew;.  sql
4040: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4050: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
4060: 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65   pToken );.  pNe
4070: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
4080: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43  lloc(db, TK_FUNC
4090: 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29  TION, pToken, 1)
40a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
40b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
40c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
40d0: 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69   pList); /* Avoi
40e0: 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68  d memory leak wh
40f0: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  en malloc fails 
4100: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
4110: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70  .  }.  pNew->x.p
4120: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
4130: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
4140: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
4150: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
4160: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
4170: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
4180: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
4190: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
41a0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
41b0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
41c0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
41d0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
41e0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
41f0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
4200: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
4210: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
4220: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
4230: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
4240: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
4250: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
4260: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
4270: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
4280: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
4290: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
42a0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
42b0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
42c0: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
42d0: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
42e0: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
42f0: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
4300: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
4310: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
4320: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
4330: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
4340: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
4350: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
4360: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
4370: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
4380: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
4390: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
43a0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
43b0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
43c0: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
43d0: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
43e0: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
43f0: 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  enial variable n
4400: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
4410: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
4420: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
4430: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
4440: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
4450: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
4460: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4470: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4480: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
4490: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
44a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
44b0: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
44c0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
44d0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
44e0: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
44f0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
4500: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
4510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
4520: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b  ]!=0 );.  if( z[
4530: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  1]==0 ){.    /* 
4540: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
4550: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
4560: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
4570: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4580: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d    assert( z[0]==
4590: 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72  '?' );.    pExpr
45a0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2b 2b 70 50  ->iColumn = ++pP
45b0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65  arse->nVar;.  }e
45c0: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f  lse if( z[0]=='?
45d0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
45e0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
45f0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
4600: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
4610: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
4620: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4630: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4640: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
4650: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4660: 3d 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72  = i = atoi((char
4670: 2a 29 26 7a 5b 31 5d 29 3b 0a 20 20 20 20 74 65  *)&z[1]);.    te
4680: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
4690: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
46a0: 3d 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =1 );.    testca
46b0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
46c0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
46d0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
46e0: 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
46f0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4700: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4710: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4720: 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c  ;.    if( i<1 ||
4730: 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   i>db->aLimit[SQ
4740: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4750: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
4760: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
4780: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
4790: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
47a0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
47b0: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
47c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
47d0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
47e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
47f0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
4800: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4810: 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ar = i;.    }.  
4820: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
4830: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
4840: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
4850: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
4860: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
4870: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
4880: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
4890: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
48a0: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
48b0: 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61  e name.    ** ha
48c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
48d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
48e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
48f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20   number.    */. 
4900: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33     int i;.    u3
4910: 32 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  2 n;.    n = sql
4920: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
4930: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4940: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4950: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
4960: 70 72 20 2a 70 45 20 3d 20 70 50 61 72 73 65 2d  pr *pE = pParse-
4970: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 3b 0a 20  >apVarExpr[i];. 
4980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
4990: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
49a0: 6d 65 6d 63 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f  memcmp(pE->u.zTo
49b0: 6b 65 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26  ken, z, n)==0 &&
49c0: 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d   pE->u.zToken[n]
49d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
49e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
49f0: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pE->iColumn;.   
4a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
4a20: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  ( i>=pParse->nVa
4a30: 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  rExpr ){.      p
4a40: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4a50: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
4a60: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
4a70: 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61 72  ->nVarExpr>=pPar
4a80: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
4a90: 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  c-1 ){.        p
4aa0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
4ab0: 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e  lloc += pParse->
4ac0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20  nVarExprAlloc + 
4ad0: 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  10;.        pPar
4ae0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d 0a  se->apVarExpr =.
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4b00: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
4b10: 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ee(.            
4b20: 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20    db,.          
4b30: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
4b40: 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  rExpr,.         
4b50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
4b60: 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f  rExprAlloc*sizeo
4b70: 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  f(pParse->apVarE
4b80: 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  xpr[0]).        
4b90: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
4ba0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
4bb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
4bc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
4bd0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21  arse->apVarExpr!
4be0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
4bf0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
4c00: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4c10: 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ++] = pExpr;.   
4c20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a     }.    }.  } .
4c30: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
4c40: 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Err && pParse->n
4c50: 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  Var>db->aLimit[S
4c60: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4c70: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
4c80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4c90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
4ca0: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
4cb0: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
4cc0: 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 20 65 78 70  .** Clear an exp
4cd0: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
4ce0: 65 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  e without deleti
4cf0: 6e 67 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ng the structure
4d00: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 53 75 62 73   itself..** Subs
4d10: 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c 65  tructure is dele
4d20: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
4d30: 69 74 65 33 45 78 70 72 43 6c 65 61 72 28 73 71  ite3ExprClear(sq
4d40: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
4d50: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
4d60: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78  !=0 );.  if( !Ex
4d70: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4d80: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
4d90: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4da0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4db0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
4dc0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4dd0: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
4de0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
4df0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
4e00: 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e 66  educed) && (p->f
4e10: 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c  lags2 & EP2_Mall
4e20: 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  ocedToken)!=0 ){
4e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4e40: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
4e50: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oken);.    }.   
4e60: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
4e70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
4e80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
4e90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
4ea0: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  te(db, p->x.pSel
4eb0: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
4ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4ed0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
4ee0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4ef0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4f00: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
4f10: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
4f20: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
4f30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4f40: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
4f50: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
4f60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4f70: 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
4f80: 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 21  (db, p);.  if( !
4f90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4fa0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
4fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4fc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
4fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4fe0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4ff0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5000: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5010: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5020: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5030: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5040: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5050: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5060: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5070: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5080: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5090: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
50a0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
50b0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
50c0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
50d0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
50e0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
50f0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5100: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5110: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5120: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5130: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5140: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5150: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5160: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5170: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5180: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5190: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
51a0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
51b0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
51c0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
51d0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
51e0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
51f0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5200: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5210: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5220: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5230: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5240: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5250: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5260: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5270: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5280: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5290: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
52a0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
52b0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
52c0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
52d0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
52e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5320: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
5330: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5340: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
5350: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
5360: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
5370: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
5380: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
5390: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
53a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
53b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
53c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
53d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
53e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
53f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
5400: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
5410: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
5420: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
5430: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
5440: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
5450: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
5460: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
5470: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5480: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
5490: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
54a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
54b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
54c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
54d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
54e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
54f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
5500: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
5510: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
5520: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
5530: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
5540: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
5550: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
5560: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
5570: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
5580: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
5590: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
55a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
55b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
55c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
55d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
55e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
55f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
5600: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
5610: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
5620: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
5630: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
5640: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
5650: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
5660: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5670: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
5680: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
5690: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
56a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
56b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
56c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
56d0: 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52 45  ake a EXPRDUP_RE
56e0: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
56f0: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
5700: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
5710: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
5720: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
5730: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
5740: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
5750: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
5760: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
5770: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
5780: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
5790: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
57a0: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
57b0: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
57c0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
57d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
57e0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
57f0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
5800: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
5810: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
5820: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
5830: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
5840: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
5850: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
5860: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c   */.  if( 0==(fl
5870: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5880: 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  CE) ){.    nSize
5890: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
58a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
58b0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
58c0: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
58d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
58e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
58f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5900: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
5910: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
5920: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
5930: 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64  2 & EP2_Malloced
5940: 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20  Token)==0 );.   
5950: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
5960: 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64 75  gs2 & EP2_Irredu
5970: 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20  cible)==0 );.   
5980: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
5990: 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d   p->pRight || p-
59a0: 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70  >pColl || p->x.p
59b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
59c0: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
59d0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
59e0: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
59f0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
5a00: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5a10: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
5a20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5a30: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
5a40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5a50: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
5a60: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
5a70: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
5a80: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
5a90: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5aa0: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
5ab0: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
5ac0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
5ad0: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
5ae0: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
5af0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
5b00: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
5b10: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5b20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
5b30: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5b40: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
5b50: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
5b60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b70: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
5b80: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
5b90: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
5ba0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
5bb0: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
5bc0: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
5bd0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
5be0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5bf0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
5c00: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
5c10: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
5c20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
5c30: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5c40: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
5c50: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5c60: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
5c70: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
5c80: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
5c90: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5ca0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
5cb0: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
5cc0: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
5cd0: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
5ce0: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
5cf0: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
5d00: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
5d10: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
5d20: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
5d30: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
5d40: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
5d50: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
5d60: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
5d70: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
5d80: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
5d90: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
5da0: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
5db0: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
5dc0: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
5dd0: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
5de0: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
5df0: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
5e00: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5e10: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
5e20: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
5e30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
5e40: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
5e50: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
5e60: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
5e70: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5e80: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
5e90: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
5ea0: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
5eb0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5ec0: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
5ed0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
5ee0: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
5ef0: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
5f00: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
5f10: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
5f20: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
5f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5f40: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
5f50: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
5f60: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
5f70: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
5f80: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
5f90: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
5fa0: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
5fb0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
5fc0: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
5fd0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5fe0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
5ff0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
6000: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
6010: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
6020: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
6030: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
6040: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
6050: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
6060: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
6070: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
6080: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
6090: 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64  irst byte passed
60a0: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
60b0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
60c0: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
60d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
60e0: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
60f0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
6100: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
6110: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
6120: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
6130: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
6140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
6150: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
6160: 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  /.  if( p ){.   
6170: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64   const int isRed
6180: 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58  uced = (flags&EX
6190: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
61a0: 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20     u8 *zAlloc;. 
61b0: 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61     u32 staticFla
61c0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  g = 0;..    asse
61d0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
61e0: 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a  || isReduced );.
61f0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
6200: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
6210: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
6220: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
6230: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
6240: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
6250: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20  *pzBuffer;.     
6260: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
6270: 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c  _Static;.    }el
6280: 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63  se{.      zAlloc
6290: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
62a0: 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45  ocRaw(db, dupedE
62b0: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
62c0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
62d0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
62e0: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
62f0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
6300: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
6310: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
6320: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
6330: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
6340: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
6350: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
6360: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
6370: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6380: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
6390: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
63a0: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
63b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
63c0: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
63d0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
63e0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
63f0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
6400: 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
6410: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
6420: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
6430: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6440: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
6450: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
6460: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
6470: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
6480: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ;.      int nTok
6490: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  en;.      if( !E
64a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
64b0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
64c0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
64d0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
64e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
64f0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
6500: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
6510: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
6520: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6530: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
6540: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6550: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
6560: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
6570: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
6580: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
6590: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
65a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
65b0: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65     int nSize = e
65c0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
65d0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
65e0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
65f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
6600: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
6610: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
6620: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
6630: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
6640: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
6650: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
6660: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
6670: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
6680: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  y. */.      pNew
6690: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
66a0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
66b0: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b  Only|EP_Static);
66c0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
66d0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
66e0: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
66f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
6700: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6710: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
6720: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
6730: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6740: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
6750: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  /.      if( nTok
6760: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  en ){.        ch
6770: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
6780: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6790: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
67a0: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  wSize];.        
67b0: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
67c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
67d0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  en);.      }..  
67e0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
67f0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
6800: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
6810: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  y) ){.        /*
6820: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
6830: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
6840: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
6850: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mber. */.       
6860: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6870: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
6880: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
6890: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
68a0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
68b0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
68c0: 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65  Select, isReduce
68d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
68e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
68f0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
6900: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6910: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
6920: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6930: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6940: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6950: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
6960: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
6970: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
6980: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e  asAnyProperty(pN
6990: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
69a0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
69b0: 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b          zAlloc +
69c0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
69d0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
69e0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
69f0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
6a00: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
6a10: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6a20: 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28  pLeft = exprDup(
6a30: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
6a40: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6a50: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6a60: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
6a70: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6a80: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
6a90: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
6aa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6ab0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6ac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
6ad0: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
6ae0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6af0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6b00: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20   pNew->flags2 = 
6b10: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  0;.        if( !
6b20: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6b30: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
6b40: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
6b50: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
6b60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6b70: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
6b80: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6b90: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
6ba0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6bb0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
6bc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6bd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6be0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6bf0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
6c00: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
6c10: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
6c20: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
6c30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
6c40: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
6c50: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
6c60: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
6c70: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
6c80: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
6c90: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
6ca0: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
6cb0: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
6cc0: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
6cd0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
6ce0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
6cf0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
6d00: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
6d10: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
6d20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6d30: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
6d40: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
6d50: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
6d60: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
6d70: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
6d80: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
6d90: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6da0: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
6db0: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
6dc0: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
6dd0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
6de0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
6df0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
6e00: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
6e10: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
6e20: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
6e30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
6e40: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
6e50: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6e60: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6e70: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
6e80: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
6e90: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
6ea0: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
6eb0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6ec0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
6ed0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
6ee0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
6ef0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
6f00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
6f10: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
6f20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
6f30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6f40: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6f50: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75  .  return exprDu
6f60: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
6f70: 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a  0);.}.ExprList *
6f80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6f90: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
6fa0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
6fb0: 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c   flags){.  ExprL
6fc0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
6fd0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6fe0: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
6ff0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
7000: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7010: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
7020: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7030: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
7040: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
7050: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7060: 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72    pNew->iECursor
7070: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45   = 0;.  pNew->nE
7080: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
7090: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
70a0: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
70b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
70c0: 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45  ocRaw(db,  p->nE
70d0: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
70e0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
70f0: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
7100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7110: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7120: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
7130: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
7140: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
7150: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
7160: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
7170: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
7180: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
7190: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
71a0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
71b0: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
71c0: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
71d0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
71e0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
71f0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7200: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
7210: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
7220: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7230: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
7240: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
7250: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
7260: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
7270: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
7280: 20 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d     pItem->iCol =
7290: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b   pOldItem->iCol;
72a0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69  .    pItem->iAli
72b0: 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  as = pOldItem->i
72c0: 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74  Alias;.  }.  ret
72d0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
72e0: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
72f0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
7300: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
7310: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
7320: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
7330: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
7340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
7350: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
7360: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
7370: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
7380: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
7390: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
73a0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
73b0: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
73c0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
73d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
73e0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
73f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7400: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
7410: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7420: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7430: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
7440: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
7450: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
7460: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7470: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
7480: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7490: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
74a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
74b0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
74c0: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
74d0: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
74e0: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
74f0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
7500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7510: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
7520: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7530: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7540: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
7550: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
7560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7570: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
7580: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7590: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
75a0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
75b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
75c0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
75d0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
75e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
75f0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7600: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7610: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7620: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7640: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7650: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7660: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7670: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7680: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7690: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
76a0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
76b0: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
76c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
76d0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
76e0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
76f0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7700: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7710: 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f  isPopulated = pO
7720: 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ldItem->isPopula
7730: 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ted;.    pNewIte
7740: 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
7750: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7760: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pOldItem->zIndex
7770: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7780: 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f  >notIndexed = pO
7790: 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ldItem->notIndex
77a0: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
77b0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  ->pIndex = pOldI
77c0: 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  tem->pIndex;.   
77d0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
77e0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
77f0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
7800: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
7810: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
7820: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
7830: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7840: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
7850: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
7860: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
7870: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
7880: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7890: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
78a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
78b0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
78c0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
78d0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
78e0: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
78f0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
7900: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
7910: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
7920: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
7930: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7940: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
7950: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
7960: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7970: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7990: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
79a0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
79b0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
79c0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
79d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
79e0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
79f0: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
7a00: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
7a10: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
7a20: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
7a30: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
7a40: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
7a50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7a60: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
7a70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
7a80: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
7a90: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7aa0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
7ab0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
7ac0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
7ad0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
7ae0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
7af0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7b00: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7b10: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7b20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
7b30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
7b40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
7b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7b60: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
7b70: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
7b80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
7b90: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
7ba0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
7bb0: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
7bc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7bd0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7be0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7bf0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
7c00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7c10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
7c20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7c30: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
7c40: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ist, flags);.  p
7c50: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
7c60: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
7c70: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
7c80: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
7c90: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
7ca0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
7cb0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7cc0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
7cd0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7ce0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
7cf0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7d00: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
7d10: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7d20: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
7d30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
7d40: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7d50: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7d60: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
7d70: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
7d80: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
7d90: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
7da0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
7db0: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
7dc0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
7dd0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7de0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
7df0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
7e00: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
7e10: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
7e20: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
7e30: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
7e40: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
7e50: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
7e60: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
7e70: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
7e80: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
7e90: 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
7ea0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  0;.  pNew->addrO
7eb0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
7ec0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
7ed0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
7ee0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
7ef0: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72  phm[2] = -1;.  r
7f00: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
7f10: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
7f20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7f30: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7f40: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7f50: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
7f70: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7f80: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
7f90: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
7fa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
7fb0: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
7fc0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
7fd0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
7fe0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
7ff0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
8000: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8010: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
8020: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
8030: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
8040: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
8050: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
8060: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
8070: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
8080: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
8090: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
80a0: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
80b0: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
80c0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
80d0: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
80e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
80f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8100: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8110: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8120: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
8130: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
8140: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
8150: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
8160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
8170: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
8180: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
8190: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
81a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
81b0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
81c0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
81d0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
81e0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
81f0: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
8200: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
8210: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
8220: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
8230: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
8240: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  ->nAlloc==0 );. 
8250: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
8260: 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e  nAlloc<=pList->n
8270: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75  Expr ){.    stru
8280: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8290: 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d   *a;.    int n =
82a0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
82b0: 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 4;.    a = sq
82c0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
82d0: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  b, pList->a, n*s
82e0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
82f0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
8300: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
8310: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
8320: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
8330: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
8340: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
8350: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f 73  locSize(db, a)/s
8360: 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d  izeof(a[0]);.  }
8370: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
8380: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
8390: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
83a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
83b0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
83c0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
83d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
83e0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
83f0: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
8400: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
8410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8420: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
8430: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
8440: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
8450: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
8460: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
8470: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8480: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
8490: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
84a0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
84b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
84c0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
84d0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
84e0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
84f0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
8500: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
8510: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
8520: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
8530: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
8540: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
8550: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
8560: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
8570: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
8580: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
8590: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
85a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
85b0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
85c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
85d0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
85e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
8600: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8610: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8620: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
8630: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
8640: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
8650: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
8660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
8670: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
8680: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
8690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
86a0: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
86b0: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
86c0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
86d0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
86e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
86f0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
8700: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
8710: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8720: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8730: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8740: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
8750: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
8760: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
8770: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
8780: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
8790: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
87a0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
87b0: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
87c0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
87d0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
87e0: 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d  equote && pItem-
87f0: 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33  >zName ) sqlite3
8800: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
8810: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
8820: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
8830: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
8840: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
8850: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
8860: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
8870: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8880: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
8890: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
88a0: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
88b0: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
88c0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
88d0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
88e0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
88f0: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
8900: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8910: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
8920: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
8930: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
8940: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
8950: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8960: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8970: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8980: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
8990: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
89a0: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
89b0: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
89c0: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
89d0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
89e0: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
89f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8a00: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
8a10: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
8a20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
8a30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
8a40: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
8a50: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8a60: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
8a70: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
8a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
8a90: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
8aa0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
8ab0: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
8ac0: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
8ad0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
8ae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8af0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
8b00: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
8b10: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
8b20: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
8b30: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
8b70: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
8b80: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
8b90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
8ba0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
8bb0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
8bc0: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
8bd0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
8be0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8bf0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
8c00: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
8c10: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
8c20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8c30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8c40: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
8c50: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
8c60: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
8c70: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8c80: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
8c90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
8ca0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
8cb0: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
8cc0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
8cd0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
8ce0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
8cf0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
8d00: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
8d10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8d20: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8d30: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
8d40: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
8d50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
8d60: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
8d70: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
8d80: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8d90: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
8da0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
8db0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
8dc0: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
8dd0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8de0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
8df0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
8e00: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
8e10: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
8e20: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
8e30: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
8e40: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
8e50: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
8e60: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
8e70: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
8e80: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
8e90: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8eb0: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
8ec0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
8ed0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8ee0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8ef0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8f00: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
8f10: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8f20: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
8f30: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
8f40: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
8f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
8f60: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
8f70: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20  lker callbacks. 
8f80: 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20   Walker.u.pi is 
8f90: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8fa0: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
8fb0: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
8fc0: 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72  checking an expr
8fd0: 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a  ession to see.**
8fe0: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73   if it is a cons
8ff0: 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b  tant.  Set *Walk
9000: 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20  er.u.pi to 0 if 
9010: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9020: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  s.** not constan
9030: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  t..**.** These c
9040: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
9050: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
9060: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
9070: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
9080: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9090: 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73  stant().**     s
90a0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
90b0: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a  tantNotJoin().**
90c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
90d0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
90e0: 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61  tion().**.*/.sta
90f0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
9100: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
9110: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
9120: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
9130: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  If pWalker->u.i 
9140: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
9150: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
9160: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
9170: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
9180: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9190: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
91a0: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
91b0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
91c0: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
91d0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
91e0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
91f0: 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73  .i==3 && ExprHas
9200: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
9210: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
9220: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
9230: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  u.i = 0;.    ret
9240: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9250: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
9260: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
9270: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
9280: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
9290: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
92a0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
92b0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
92c0: 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  nd pWalker->u.i=
92d0: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
92e0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
92f0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
9300: 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30  .i==2 ) return 0
9310: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
9320: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
9330: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
9340: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
9350: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
9360: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
9370: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
9380: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9390: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
93a0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
93b0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
93c0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
93d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
93e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
93f0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
9400: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
9410: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
9420: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61  UMN );.      pWa
9430: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
9440: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9450: 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75  Abort;.    defau
9460: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
9470: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9480: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
9490: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
94a0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
94b0: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
94c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
94d0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
94e0: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
94f0: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
9500: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
9510: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
9520: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
9530: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
9540: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9550: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9560: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
9570: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
9580: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
9590: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
95a0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
95b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
95c0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
95d0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
95e0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
95f0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
9600: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
9610: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
9620: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
9630: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
9640: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9650: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9660: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9670: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9680: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9690: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
96a0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
96b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
96c0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
96d0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
96e0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
96f0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
9700: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
9710: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9720: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9730: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9740: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9750: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9760: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9770: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9780: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9790: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
97a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
97b0: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
97c0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
97d0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
97e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
97f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9800: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
9810: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9820: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9830: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9840: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9850: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9860: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9870: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9880: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9890: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
98a0: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
98b0: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
98c0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
98d0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
98e0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
98f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9900: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9910: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
9920: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9930: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9940: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9950: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9960: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9970: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9980: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9990: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
99a0: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
99b0: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
99c0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
99d0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
99e0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
99f0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9a00: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
9a10: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9a20: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9a30: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9a40: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9a50: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9a60: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9a70: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9a80: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9a90: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9aa0: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9ab0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9ac0: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
9ad0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
9ae0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
9af0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
9b00: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
9b10: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
9b20: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9b30: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9b40: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9b50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9b60: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9b70: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9b80: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9b90: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9ba0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9bb0: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
9bc0: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
9bd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9be0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
9bf0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
9c00: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
9c10: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  0;.  if( p->flag
9c20: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
9c30: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
9c40: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
9c50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9c60: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
9c70: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9c80: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
9c90: 72 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49  rc = sqlite3GetI
9ca0: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
9cb0: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
9cc0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
9cd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9ce0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9cf0: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
9d00: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
9d10: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
9d20: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
9d30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d40: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
9d50: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
9d60: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
9d70: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9d80: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
9d90: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
9da0: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
9db0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
9dc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9dd0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
9de0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
9df0: 28 20 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65  ( rc ){.    asse
9e00: 72 74 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  rt( ExprHasAnyPr
9e10: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
9e20: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9e30: 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y).             
9e40: 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 32 20    || (p->flags2 
9e50: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
9e60: 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ken)==0 );.    p
9e70: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  ->op = TK_INTEGE
9e80: 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  R;.    p->flags 
9e90: 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
9ea0: 20 20 20 20 70 2d 3e 75 2e 69 56 61 6c 75 65 20      p->u.iValue 
9eb0: 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20  = *pValue;.  }. 
9ec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9ed0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
9ee0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
9ef0: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
9f00: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
9f10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
9f20: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
9f30: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
9f40: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
9f50: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
9f60: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
9f70: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
9f80: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
9f90: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
9fa0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
9fb0: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
9fc0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
9fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9fe0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
9ff0: 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70  ble to the IN op
a000: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
a010: 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72  ion on a.** quer
a020: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
a030: 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28  .**       x IN (
a040: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
a050: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
a060: 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20  CT... clause is 
a070: 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
a080: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  the parameter to
a090: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
a0a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65  ..**.** The Sele
a0b0: 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ct object passed
a0c0: 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20   in has already 
a0d0: 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65  been preprocesse
a0e0: 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f  d and no.** erro
a0f0: 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75  rs have been fou
a100: 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nd..*/.#ifndef S
a110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a120: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
a130: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
a140: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
a150: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
a160: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a170: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
a180: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
a190: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
a1b0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
a1c0: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
a1d0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
a1e0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
a1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
a200: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
a210: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
a220: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
a230: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
a240: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
a250: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
a260: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
a270: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
a280: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
a290: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a2a0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
a2b0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
a2c0: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
a2d0: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
a2e0: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
a2f0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
a300: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
a310: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
a320: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
a330: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
a340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
a350: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
a360: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
a370: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
a380: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
a390: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
a3a0: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
a3b0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
a3c0: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
a3d0: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
a3e0: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
a3f0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
a400: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a420: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
a430: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
a440: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
a450: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
a460: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
a470: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
a480: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
a490: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
a4a0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
a4b0: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
a4c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
a4d0: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
a4e0: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
a4f0: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
a500: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
a510: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62    if( NEVER(pTab
a520: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
a530: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
a540: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
a550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
a560: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
a570: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
a580: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
a590: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
a5a0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
a5b0: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
a5c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
a5d0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
a5e0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
a5f0: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
a600: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
a610: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
a620: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
a630: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
a640: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
a650: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
a660: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
a670: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
a680: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a6a0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
a6b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a6c0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
a6d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
a6e0: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
a6f0: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
a700: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
a710: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
a720: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
a730: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
a740: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
a750: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
a760: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
a770: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
a780: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
a790: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
a7a0: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
a7b0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75   index of the cu
a7c0: 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74  rsor opened on t
a7d0: 68 65 20 62 2d 74 72 65 65 20 28 64 61 74 61 62  he b-tree (datab
a7e0: 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62  ase table, datab
a7f0: 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72  ase index .** or
a800: 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29   ephermal table)
a810: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58   is stored in pX
a820: 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20  ->iTable before 
a830: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
a840: 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65  turns..** The re
a850: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
a860: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
a870: 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
a880: 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
a890: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
a8a0: 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68  INDEX_ROWID - Th
a8b0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
a8c0: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
a8d0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
a8e0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54  _INDEX_INDEX - T
a8f0: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
a900: 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61  ened on a databa
a910: 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  se index..**   I
a920: 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20  N_INDEX_EPH -   
a930: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
a940: 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
a950: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
a960: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a970: 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
a980: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
a990: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
a9a0: 69 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20 6f  ing b-tree may o
a9b0: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74  nly be used if t
a9c0: 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
a9d0: 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f  the simple.** fo
a9e0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  rm:.**.**     SE
a9f0: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
aa00: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
aa10: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
aa20: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
aa30: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
aa40: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
aa50: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
aa60: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
aa70: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
aa80: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
aa90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
aaa0: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
aab0: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
aac0: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
aad0: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
aae0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
aaf0: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
ab00: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
ab10: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
ab20: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
ab30: 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63  * has a UNIQUE c
ab40: 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49  onstraint or UNI
ab50: 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  QUE index..**.**
ab60: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
ab70: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
ab80: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
ab90: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
aba0: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
abb0: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
abc0: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
abd0: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
abe0: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
abf0: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
ac00: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
ac10: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ac20: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
ac30: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
ac40: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
ac50: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
ac60: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lumn..**.** When
ac70: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
ac80: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
ac90: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
aca0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
acb0: 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  tion.** needs to
acc0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
acd0: 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75   not the structu
ace0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53  re contains an S
acf0: 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75  QL NULL .** valu
ad00: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
ad10: 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65  rrectly evaluate
ad20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b   expressions lik
ad30: 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e  e "X IN (Y, Z)".
ad40: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
ad50: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
ad60: 65 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 63  e b-tree might c
ad70: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
ad80: 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
ad90: 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
ada0: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
adb0: 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
adc0: 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
add0: 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e  ** to *prNotFoun
ade0: 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  d. If there is n
adf0: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
ae00: 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
ae10: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
ae20: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
ae30: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
ae40: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
ae50: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
ae60: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
ae70: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
ae80: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
ae90: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
aea0: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
aeb0: 4c 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  L. If the b-tree
aec0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
aed0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
aee0: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
aef0: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
af00: 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
af10: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 62   generates the b
af20: 2d 74 72 65 65 0a 2a 2a 20 69 73 20 61 20 63 6f  -tree.** is a co
af30: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
af40: 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  y) then the valu
af50: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
af60: 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ed register is.*
af70: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
af80: 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 62 2d  each time the b-
af90: 74 72 65 65 20 69 73 20 72 65 70 6f 70 75 6c 61  tree is repopula
afa0: 74 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ted. This allows
afb0: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
afc0: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
afd0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
afe0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
aff0: 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65  **   if( registe
b000: 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20  r==NULL ){.**   
b010: 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65    has_null = <te
b020: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
b030: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
b040: 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73  ll>.**     regis
b050: 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a  ter = 1.**   }.*
b060: 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  *.** in order to
b070: 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74   avoid running t
b080: 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61  he <test if data
b090: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
b0a0: 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73  ins null>.** tes
b0b0: 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  t more often tha
b0c0: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
b0d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
b0e0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b0f0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
b100: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
b110: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
b120: 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29  int *prNotFound)
b130: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
b160: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
b170: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
b180: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
b190: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
b1b0: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
b1c0: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
b1d0: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
b1e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
b1f0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
b200: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
b210: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
b220: 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74  eUnique = (prNot
b230: 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20  Found==0);   /* 
b240: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
b250: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 0a 20   be unique */.. 
b260: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
b270: 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20  =TK_IN );..  /* 
b280: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
b290: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
b2a0: 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
b2b0: 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
b2c0: 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
b2d0: 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
b2e0: 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
b2f0: 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
b300: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
b310: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70  .  */.  p = (Exp
b320: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
b330: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f   EP_xIsSelect) ?
b340: 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a   pX->x.pSelect :
b350: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
b360: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
b370: 30 29 20 26 26 20 69 73 43 61 6e 64 69 64 61 74  0) && isCandidat
b380: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a  eForInOpt(p) ){.
b390: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
b3a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
b3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
b3c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b3d0: 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  n */.    Expr *p
b3e0: 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
b3f0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 20 20 20  ->a[0].pExpr;   
b400: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63  /* Expression <c
b410: 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e  olumn> */.    in
b420: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
b430: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
b440: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
b450: 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e   column <column>
b460: 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 20   */.    Vdbe *v 
b470: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b480: 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f  (pParse);      /
b490: 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
b4a0: 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
b4b0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
b4c0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
b4d0: 2e 70 54 61 62 3b 20 20 20 20 20 20 2f 2a 20 54  .pTab;      /* T
b4e0: 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
b4f0: 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
b520: 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
b530: 70 54 61 62 20 2a 2f 0a 20 20 20 0a 20 20 20 20  pTab */.   .    
b540: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65  /* Code an OP_Ve
b550: 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f  rifyCookie and O
b560: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
b570: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
b580: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
b590: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
b5a0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
b5b0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
b5c0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
b5d0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
b5e0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
b5f0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
b600: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
b610: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
b620: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b630: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
b640: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
b650: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
b660: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
b670: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b680: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
b690: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
b6a0: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
b6b0: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
b6c0: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
b6d0: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
b6e0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
b6f0: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
b700: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
b710: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a      int iAddr;..
b720: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
b730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b740: 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b  v, OP_If, iMem);
b750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b760: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b770: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
b780: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
b790: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
b7a0: 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
b7b0: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
b7c0: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
b7d0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
b7e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b7f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
b800: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
b810: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
b820: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
b830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
b840: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
b850: 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
b860: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b870: 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  nce used by the 
b880: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61  comparison. If a
b890: 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20  n index is to.  
b8a0: 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69      ** be used i
b8b0: 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d  n place of a tem
b8c0: 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74  p-table, it must
b8d0: 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f   be ordered acco
b8e0: 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  rding.      ** t
b8f0: 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  o this collation
b900: 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20   sequence.  */. 
b910: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
b920: 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
b930: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
b940: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
b950: 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20  ft, pExpr);..   
b960: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
b970: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
b980: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
b990: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a  to perform the .
b9a0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
b9b0: 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
b9c0: 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
b9d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49  of the column. I
b9e0: 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  f.      ** it is
b9f0: 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20   not, it is not 
ba00: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
ba10: 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  any index..     
ba20: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 61   */.      char a
ba30: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
ba40: 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20  ffinity(pX);.   
ba50: 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f     int affinity_
ba60: 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c  ok = (pTab->aCol
ba70: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d  [iCol].affinity=
ba80: 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54  =aff||aff==SQLIT
ba90: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20  E_AFF_NONE);..  
baa0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
bab0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
bac0: 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
bad0: 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
bae0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
baf0: 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78         if( (pIdx
bb00: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
bb10: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26  Col).         &&
bb20: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
bb30: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
bb40: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
bb50: 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20  , 0)==pReq.     
bb60: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
bb70: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
bb80: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
bb90: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
bba0: 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29  None)).        )
bbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
bbc0: 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
bbd0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
bbe0: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
bbf0: 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79        char *pKey
bc00: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70  ;.  .          p
bc10: 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71  Key = (char *)sq
bc20: 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
bc30: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
bc40: 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72  .          iAddr
bc50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bc60: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69  dOp1(v, OP_If, i
bc70: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Mem);.          
bc80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bc90: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bca0: 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20   1, iMem);.  .  
bcb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bcc0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
bcd0: 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
bce0: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c  pIdx->tnum, iDb,
bcf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f  pKey,P4_KEYINFO_
bd20: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
bd30: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
bd40: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
bd50: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
bd60: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
bd70: 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20  DEX_INDEX;..    
bd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bd90: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
bda0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
bdb0: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26  f( prNotFound &&
bdc0: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
bdd0: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l].notNull ){.  
bde0: 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74            *prNot
bdf0: 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  Found = ++pParse
be00: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
be10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
be20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
be30: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
be40: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
be50: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69  not found an exi
be60: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
be70: 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
be80: 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
be90: 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
bea0: 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
beb0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
bec0: 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
bed0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
bee0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
bef0: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
bf00: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
bf10: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29  if( prNotFound )
bf20: 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f  {.      *prNotFo
bf30: 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  und = rMayHaveNu
bf40: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
bf50: 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Mem;.    }else i
bf60: 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
bf70: 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
bf80: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
bf90: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
bfa0: 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65 20   ){.      eType 
bfb0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
bfc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bfd0: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
bfe0: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
bff0: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
c000: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
c010: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c020: 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
c030: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
c040: 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
c050: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c060: 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
c070: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
c080: 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  as an expression
c090: 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61  .** and IN opera
c0a0: 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
c0b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
c0c0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
c0d0: 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
c0e0: 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
c0f0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
c100: 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
c110: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
c120: 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
c130: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
c140: 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
c150: 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
c160: 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
c170: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
c180: 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
c190: 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
c1a0: 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
c1b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
c1c0: 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
c1d0: 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
c1e0: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
c1f0: 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
c200: 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
c210: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
c220: 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
c230: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
c240: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
c250: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
c260: 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
c270: 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
c280: 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
c290: 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
c2a0: 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
c2b0: 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
c2c0: 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
c2d0: 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
c2e0: 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
c2f0: 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
c300: 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
c310: 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
c320: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
c330: 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
c340: 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
c350: 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
c360: 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
c370: 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
c380: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
c390: 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
c3a0: 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
c3b0: 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
c3c0: 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
c3d0: 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
c3e0: 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
c3f0: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65  Furthermore, the
c400: 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48 45 52   IN is in a WHER
c410: 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 61  E clause and tha
c420: 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61 6e 74  t we really want
c430: 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65 20 6f  .** to iterate o
c440: 76 65 72 20 74 68 65 20 52 48 53 20 6f 66 20 74  ver the RHS of t
c450: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
c460: 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69 63 6b  n order to quick
c470: 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c  ly locate.** all
c480: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c   corresponding L
c490: 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c  HS elements.  Al
c4a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
c4b0: 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
c4c0: 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  e.** the registe
c4d0: 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
c4e0: 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e  aveNull to NULL.
c4f0: 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
c500: 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20  es will take.** 
c510: 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
c520: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 76   this register v
c530: 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
c540: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
c550: 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
c560: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
c570: 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  is zero, that me
c580: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
c590: 71 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 75  query is being u
c5a0: 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65  sed.** for membe
c5b0: 72 73 68 69 70 20 74 65 73 74 69 6e 67 20 6f 6e  rship testing on
c5c0: 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ly.  There is no
c5d0: 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   need to initial
c5e0: 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73  ize any.** regis
c5f0: 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61 74 65  ters to indicate
c600: 20 74 68 65 20 70 72 65 73 65 6e 73 65 20 6f 72   the presense or
c610: 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c   absence of NULL
c620: 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  s on the RHS..**
c630: 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
c640: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
c650: 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
c660: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
c670: 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
c680: 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61  t.  For IN opera
c690: 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
c6a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
c6b0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
c6c0: 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  0..*/.#ifndef SQ
c6d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c6e0: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
c6f0: 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
c700: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c710: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c720: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c730: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
c740: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
c750: 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
c760: 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
c770: 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
c780: 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ll,       /* Reg
c790: 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
c7a0: 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
c7b0: 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
c7c0: 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
c7e0: 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
c7f0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
c800: 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
c810: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20   testAddr = 0;  
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
c840: 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
c850: 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c880: 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
c890: 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
c8a0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
c8b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
c8c0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
c8d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
c8e0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
c8f0: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
c900: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
c910: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
c920: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
c930: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
c940: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
c950: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
c960: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
c970: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
c980: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
c990: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
c9a0: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
c9b0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
c9c0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
c9d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
c9e0: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
c9f0: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
ca00: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
ca10: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
ca20: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
ca30: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
ca40: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
ca50: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
ca60: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
ca70: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
ca80: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
ca90: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
caa0: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
cab0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
cac0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
cad0: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
cae0: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
caf0: 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
cb00: 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70     int mem = ++p
cb10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
cb20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb30: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d  p1(v, OP_If, mem
cb40: 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20  );.    testAddr 
cb50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cb60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
cb70: 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20  r, 1, mem);.    
cb80: 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72  assert( testAddr
cb90: 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  >0 || pParse->db
cba0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cbb0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
cbc0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
cbd0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
cbe0: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
cbf0: 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ity;.      KeyIn
cc00: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
cc10: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
cc20: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
cc30: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
cc40: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
cc50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
cc60: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
cc70: 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  t;..      if( rM
cc80: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
cc90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cca0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
ccb0: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
ccc0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
ccd0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
cce0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
ccf0: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
cd00: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
cd10: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
cd20: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
cd30: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
cd40: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
cd50: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
cd60: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
cd70: 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61  ay. A virtual ta
cd80: 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
cd90: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e   filled with sin
cda0: 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20  gle-field index 
cdb0: 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
cdc0: 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  g the results.  
cdd0: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
cde0: 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
cdf0: 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
ce00: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
ce10: 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
ce20: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
ce30: 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
ce40: 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
ce50: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
ce60: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
ce70: 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
ce80: 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
ce90: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
cea0: 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
ceb0: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
cec0: 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
ced0: 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
cee0: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
cef0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
cf00: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
cf10: 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
cf20: 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
cf30: 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
cf40: 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
cf50: 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
cf60: 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
cf70: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
cf80: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
cf90: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
cfa0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
cfb0: 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
cfc0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
cfd0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
cfe0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
cff0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d000: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d010: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
d020: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69  Expr->iTable, !i
d030: 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 6d  sRowid);.      m
d040: 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20  emset(&keyInfo, 
d050: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66  0, sizeof(keyInf
d060: 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  o));.      keyIn
d070: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a  fo.nField = 1;..
d080: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
d090: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
d0a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
d0b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
d0c0: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
d0d0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
d0e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
d0f0: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
d100: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
d110: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
d120: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
d130: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
d140: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
d150: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
d160: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
d170: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
d180: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
d190: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d1a0: 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
d1b0: 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
d1c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
d1d0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
d1e0: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
d1f0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
d200: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e        dest.affin
d210: 69 74 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69  ity = (u8)affini
d220: 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ty;.        asse
d230: 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62  rt( (pExpr->iTab
d240: 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d  le&0x0000FFFF)==
d250: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
d260: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
d270: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d280: 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
d290: 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
d2a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
d2b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d2c0: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
d2d0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
d2e0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
d2f0: 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
d300: 74 21 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e  t!=0 && pEList->
d310: 6e 45 78 70 72 3e 30 29 20 29 7b 20 0a 20 20 20  nExpr>0) ){ .   
d320: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
d330: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
d340: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
d350: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
d360: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
d370: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
d380: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
d390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d3a0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
d3b0: 78 2e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  x.pList!=0 ){.  
d3c0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
d3d0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
d3e0: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
d3f0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
d400: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
d410: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
d420: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
d430: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
d440: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
d450: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
d460: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
d470: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
d480: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
d490: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
d4a0: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
d4b0: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
d4c0: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
d4d0: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
d4e0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
d4f0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
d500: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d510: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
d520: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
d530: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
d540: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
d550: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d560: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
d570: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
d580: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
d590: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
d5a0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
d5b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
d5c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d5d0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
d5e0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
d5f0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d600: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
d610: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
d620: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
d630: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
d640: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
d650: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
d660: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
d670: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
d680: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
d690: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
d6a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
d6c0: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
d6d0: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
d6e0: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
d6f0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
d700: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
d710: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
d720: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
d730: 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
d740: 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
d750: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
d760: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
d770: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
d780: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
d790: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
d7a0: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
d7b0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
d7c0: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
d7d0: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
d7e0: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
d7f0: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
d800: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
d810: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
d820: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
d830: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
d840: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
d850: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
d860: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
d870: 66 28 20 74 65 73 74 41 64 64 72 20 26 26 20 21  f( testAddr && !
d880: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
d890: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
d8a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d8b0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
d8c0: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
d8d0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   2);.           
d8e0: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
d8f0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
d900: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
d910: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
d920: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
d930: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
d940: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
d950: 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
d960: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
d970: 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
d980: 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
d990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d9a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
d9b0: 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
d9c0: 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
d9d0: 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
d9e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d9f0: 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
da00: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
da10: 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
da20: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
da30: 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
da40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
da50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
da60: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
daa0: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
dac0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dad0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
dae0: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
daf0: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
db00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
db10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db20: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
db30: 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
db40: 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
db50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
db60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
db70: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
db80: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
dba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dbb0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
dbc0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
dbd0: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
dbe0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
dbf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc00: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
dc10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
dc20: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
dc30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
dc40: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
dc50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dc60: 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20   !isRowid ){.   
dc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc80: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
dc90: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
dca0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
dcb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
dcc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
dcd0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
dce0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
dcf0: 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
dd00: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
dd10: 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
dd20: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
dd30: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
dd40: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
dd50: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
dd60: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
dd70: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
dd80: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
dd90: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
dda0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
ddb0: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
ddc0: 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
ddd0: 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
dde0: 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
ddf0: 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
de00: 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
de10: 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
de20: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
de30: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
de40: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
de50: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
de60: 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d  onst Token one =
de70: 20 7b 20 22 31 22 2c 20 31 20 7d 3b 20 20 2f 2a   { "1", 1 };  /*
de80: 20 54 6f 6b 65 6e 20 66 6f 72 20 6c 69 74 65 72   Token for liter
de90: 61 6c 20 76 61 6c 75 65 20 31 20 2a 2f 0a 20 20  al value 1 */.  
dea0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
deb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
ded0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
dee0: 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
def0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
df00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df10: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
df20: 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
df30: 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  t result */..   
df40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
df50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
df60: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
df70: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
df80: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
df90: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
dfa0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
dfb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
dfc0: 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20  _SELECT );..    
dfd0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
dfe0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
dff0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
e000: 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
e010: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
e020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
e030: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
e040: 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
e050: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
e060: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e070: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
e080: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
e090: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
e0a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e0b0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
e0c0: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
e0d0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
e0e0: 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
e0f0: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
e100: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e110: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
e120: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
e130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e140: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e150: 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
e160: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
e170: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e180: 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
e190: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
e1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e1b0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
e1c0: 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  b, pSel->pLimit)
e1d0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
e1e0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
e1f0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
e200: 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f  NTEGER, 0, 0, &o
e210: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ne);.      if( s
e220: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
e230: 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
e240: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
e250: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
e260: 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
e270: 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  .iParm;.      Ex
e280: 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
e290: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  (pExpr);.      b
e2a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
e2b0: 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20  .  if( testAddr 
e2c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e2d0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
e2e0: 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 20  stAddr-1);.  }. 
e2f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
e300: 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
e310: 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
e320: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e330: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e340: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
e350: 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
e360: 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
e370: 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
e380: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
e390: 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
e3a0: 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
e3b0: 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
e3c0: 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
e3d0: 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
e3e0: 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
e3f0: 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
e400: 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn out;.}../*.**
e410: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
e420: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
e430: 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
e440: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
e450: 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
e460: 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
e470: 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
e480: 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
e490: 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
e4a0: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
e4b0: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
e4c0: 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
e4d0: 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
e4e0: 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
e4f0: 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
e500: 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
e510: 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
e520: 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
e530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
e540: 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
e550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
e560: 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
e570: 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
e580: 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
e590: 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
e5a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20  .    char *zV;. 
e5b0: 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
e5c0: 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 61  , &value);.    a
e5d0: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
e5e0: 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
e5f0: 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
e600: 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
e610: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
e620: 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
e630: 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20   -value;.    zV 
e640: 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
e650: 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
e660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e670: 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
e680: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
e690: 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
e6a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
e6b0: 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
e6c0: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
e6d0: 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
e6e0: 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
e6f0: 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
e700: 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
e710: 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
e720: 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
e730: 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
e740: 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
e750: 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
e760: 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
e770: 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
e780: 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
e790: 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
e7a0: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
e7b0: 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
e7c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
e7d0: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
e7e0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
e7f0: 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
e800: 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70 45 78 70  Mem){.  if( pExp
e810: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
e820: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
e830: 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
e840: 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 6e  Value;.    if( n
e850: 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
e860: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e870: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
e880: 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
e890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
e8a0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
e8b0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
e8c0: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
e8d0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e8e0: 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c  3FitsIn64Bits(z,
e8f0: 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
e900: 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
e910: 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
e920: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
e930: 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
e940: 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
e950: 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
e960: 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  ;.      zV = dup
e970: 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
e980: 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
e990: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e9a0: 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
e9b0: 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
e9c0: 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
e9d0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52  lse{.      codeR
e9e0: 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
e9f0: 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  g, iMem);.    }.
ea00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
ea10: 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
ea20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ea30: 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
ea40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ea50: 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
ea60: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
ea70: 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
ea80: 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
ea90: 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
eaa0: 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
eab0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
eac0: 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
ead0: 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
eae0: 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
eaf0: 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
eb00: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
eb10: 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
eb20: 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
eb30: 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
eb40: 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
eb50: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
eb60: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
eb70: 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
eb80: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
eb90: 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
eba0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ebb0: 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
ebc0: 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
ebd0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
ebe0: 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
ebf0: 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
ec00: 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
ec10: 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
ec20: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
ec30: 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
ec40: 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
ec50: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
ec60: 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
ec70: 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
ec80: 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
ec90: 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
eca0: 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
ecb0: 74 72 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  try */.  for(i=0
ecc0: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
ecd0: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
ece0: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
ecf0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
ed00: 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54 61  ->iReg && p->iTa
ed10: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e  ble==iTab && p->
ed20: 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b  iColumn==iCol ){
ed30: 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
ed40: 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
ed50: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  );.      p->iLev
ed60: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
ed70: 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
ed80: 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
ed90: 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e        p->affChan
eda0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ge = 0;.      p-
edb0: 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
edc0: 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
edd0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ede0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61    }..  /* Find a
edf0: 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64  n empty slot and
ee00: 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20   replace it */. 
ee10: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
ee20: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
ee30: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
ee40: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
ee50: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
ee60: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  0 ){.      p->iL
ee70: 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
ee80: 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
ee90: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
eea0: 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  ab;.      p->iCo
eeb0: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
eec0: 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
eed0: 67 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 43  g;.      p->affC
eee0: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
eef0: 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
ef00: 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
ef10: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
ef20: 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
ef30: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
ef40: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
ef50: 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
ef60: 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
ef70: 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
ef80: 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
ef90: 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
efa0: 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
efb0: 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
efc0: 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
efd0: 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
efe0: 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
eff0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
f000: 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
f010: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
f020: 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
f030: 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
f040: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
f050: 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
f060: 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
f070: 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
f080: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
f090: 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
f0a0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
f0b0: 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
f0c0: 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 30  p->affChange = 0
f0d0: 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  ;.    p->tempReg
f0e0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75   = 0;.    p->lru
f0f0: 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
f100: 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  eCnt++;.    retu
f110: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
f120: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
f130: 20 72 65 67 69 73 74 65 72 20 69 73 20 62 65 69   register is bei
f140: 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
f150: 20 50 75 72 67 65 20 74 68 65 20 72 65 67 69 73   Purge the regis
f160: 74 65 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ter.** from the 
f170: 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
f180: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
f190: 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72  rCacheRemove(Par
f1a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f1b0: 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
f1c0: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
f1d0: 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
f1e0: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
f1f0: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
f200: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
f210: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
f220: 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
f230: 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
f240: 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
f250: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
f260: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
f270: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
f280: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
f290: 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
f2a0: 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
f2b0: 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
f2c0: 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
f2d0: 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
f2e0: 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
f2f0: 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
f300: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
f310: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
f320: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f330: 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
f340: 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
f350: 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d  iCacheLevel++;.}
f360: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
f370: 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
f380: 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
f390: 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
f3a0: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
f3b0: 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73  e previous N Pus
f3c0: 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49  h operations.  I
f3d0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
f3e0: 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65  estore the cache
f3f0: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65  .** to the state
f400: 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73   it was in N Pus
f410: 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64  hes ago..*/.void
f420: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f430: 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
f440: 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  se, int N){.  in
f450: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
f460: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
f470: 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61  sert( N>0 );.  a
f480: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
f490: 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b  CacheLevel>=N );
f4a0: 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
f4b0: 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66  eLevel -= N;.  f
f4c0: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
f4d0: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
f4e0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
f4f0: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
f500: 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
f510: 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
f520: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
f530: 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
f540: 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
f550: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
f560: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f570: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
f580: 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
f590: 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
f5a0: 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
f5b0: 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
f5c0: 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
f5d0: 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
f5e0: 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
f5f0: 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
f600: 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
f610: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
f620: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
f630: 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
f640: 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
f650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f660: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f670: 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
f680: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f690: 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
f6a0: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
f6b0: 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
f6c0: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
f6d0: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
f6e0: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
f6f0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
f700: 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
f710: 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
f720: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f730: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f740: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
f750: 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
f760: 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
f770: 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
f780: 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
f790: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
f7a0: 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
f7b0: 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
f7c0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
f7d0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
f7e0: 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
f7f0: 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
f800: 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
f810: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
f820: 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
f830: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
f840: 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
f850: 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
f860: 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
f870: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
f880: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
f890: 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
f8a0: 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
f8b0: 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
f8c0: 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
f8d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f8e0: 65 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  e might attempt 
f8f0: 74 6f 20 72 65 75 73 65 20 74 68 65 20 76 61 6c  to reuse the val
f900: 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ue of the column
f910: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72   that.** has alr
f920: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
f930: 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
f940: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 77 69 6c  .  The value wil
f950: 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75  l always.** be u
f960: 73 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  sed if it has no
f970: 74 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20  t undergone any 
f980: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73  affinity changes
f990: 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20  .  But if.** an 
f9a0: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
f9b0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
f9c0: 65 6e 20 74 68 65 20 63 61 63 68 65 64 20 76 61  en the cached va
f9d0: 6c 75 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  lue will only be
f9e0: 0a 2a 2a 20 75 73 65 64 20 69 66 20 61 6c 6c 6f  .** used if allo
f9f0: 77 41 66 66 43 68 6e 67 20 69 73 20 74 72 75 65  wAffChng is true
fa00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa10: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
fa20: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
fa30: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
fa40: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
fa50: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
fa60: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
fa70: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
fa80: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
fa90: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
faa0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
fab0: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
fac0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
fad0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
fae0: 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
faf0: 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
fb00: 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
fb10: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
fb20: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
fb30: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
fb40: 20 69 6e 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e   int allowAffChn
fb50: 67 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 69  g /* True if pri
fb60: 6f 72 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  or affinity chan
fb70: 67 65 73 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b  ges are OK */.){
fb80: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
fb90: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
fba0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
fbb0: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
fbc0: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
fbd0: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
fbe0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
fbf0: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
fc00: 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
fc10: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
fc20: 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
fc30: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
fc40: 20 20 20 20 20 20 26 26 20 28 21 70 2d 3e 61 66        && (!p->af
fc50: 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77  fChange || allow
fc60: 41 66 66 43 68 6e 67 29 20 29 7b 0a 20 20 20 20  AffChng) ){.    
fc70: 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
fc80: 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
fc90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fca0: 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
fcb0: 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
fcc0: 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
fcd0: 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
fce0: 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
fcf0: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43  v!=0 );.  if( iC
fd00: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 73  olumn<0 ){.    s
fd10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fd20: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
fd30: 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d  able, iReg);.  }
fd40: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
fd50: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
fd60: 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
fd70: 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
fd80: 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
fd90: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
fda0: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
fdb0: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
fdc0: 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
fdd0: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
fde0: 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d  (v, pTab, iColum
fdf0: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20  n, iReg);.  }.  
fe00: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
fe10: 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
fe20: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
fe30: 52 65 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  Reg);.  return i
fe40: 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
fe50: 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
fe60: 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
fe70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
fe80: 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
fe90: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
fea0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
feb0: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
fec0: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
fed0: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
fee0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
fef0: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
ff00: 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a   if( p->iReg ){.
ff10: 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
ff20: 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
ff30: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
ff40: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
ff50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
ff60: 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
ff70: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
ff80: 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
ff90: 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
ffa0: 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
ffb0: 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
ffc0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
ffd0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
ffe0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
fff0: 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
10000 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69  iCount){.  int i
10010 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
10020 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74  Count - 1;.  int
10030 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
10040 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
10050 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
10060 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
10070 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
10080 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
10090 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
100a0 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74 61 72      if( r>=iStar
100b0 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a  t && r<=iEnd ){.
100c0 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e        p->affChan
100d0 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ge = 1;.    }.  
100e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
100f0 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
10100 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
10110 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
10120 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
10130 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
10140 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
10150 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
10160 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
10170 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
10180 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
10190 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
101a0 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
101b0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
101c0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
101d0 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   *p;.  if( NEVER
101e0 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72  (iFrom==iTo) ) r
101f0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
10200 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
10210 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
10220 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
10230 52 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Reg);.  for(i=0,
10240 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
10250 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
10260 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
10270 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  p++){.    int x 
10280 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
10290 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78  f( x>=iFrom && x
102a0 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20  <iFrom+nReg ){. 
102b0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20       p->iReg += 
102c0 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d  iTo-iFrom;.    }
102d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
102e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
102f0 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  opy content from
10300 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
10310 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
10320 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
10330 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76  iTo+nReg-1..*/.v
10340 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
10350 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70  odeCopy(Parse *p
10360 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
10370 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
10380 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
10390 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d   if( NEVER(iFrom
103a0 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b  ==iTo) ) return;
103b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
103c0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  eg; i++){.    sq
103d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
103e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
103f0 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c  P_Copy, iFrom+i,
10400 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a   iTo+i);.  }.}..
10410 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
10420 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
10430 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
10440 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
10450 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
10460 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
10470 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
10480 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
10490 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
104a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
104b0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
104c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
104d0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
104e0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
104f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10500 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
10510 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
10520 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
10530 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
10540 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
10550 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  o ) return 1;.  
10560 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
10570 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
10580 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  st instruction c
10590 6f 64 65 64 20 69 73 20 61 6e 20 65 70 68 65 6d  oded is an ephem
105a0 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79  eral copy of any
105b0 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67 69 73   of.** the regis
105c0 74 65 72 73 20 69 6e 20 74 68 65 20 6e 52 65 67  ters in the nReg
105d0 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
105e0 6e 69 6e 67 20 77 69 74 68 20 69 52 65 67 2c 20  ning with iReg, 
105f0 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20  then.** convert 
10600 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63  the last instruc
10610 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f  tion from OP_SCo
10620 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a  py to OP_Copy..*
10630 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
10640 70 72 48 61 72 64 43 6f 70 79 28 50 61 72 73 65  prHardCopy(Parse
10650 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
10660 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
10670 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
10680 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
10690 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
106a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
106b0 29 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  );.  v = pParse-
106c0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
106d0 28 20 76 21 3d 30 20 29 3b 0a 20 20 70 4f 70 20  ( v!=0 );.  pOp 
106e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
106f0 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 61 73 73  Op(v, -1);.  ass
10700 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20  ert( pOp!=0 );. 
10710 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
10720 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f  ==OP_SCopy && pO
10730 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70  p->p1>=iReg && p
10740 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67  Op->p1<iReg+nReg
10750 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63   ){.    pOp->opc
10760 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20  ode = OP_Copy;. 
10770 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
10780 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 6f  rate code to sto
10790 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
107a0 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c  the iAlias-th al
107b0 69 61 73 20 69 6e 20 72 65 67 69 73 74 65 72 0a  ias in register.
107c0 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  ** target.  The 
107d0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
107e0 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78 70 72  is called, pExpr
107f0 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 74 6f   is evaluated to
10800 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
10810 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 69  value of the ali
10820 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  as.  The value i
10830 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
10840 75 78 69 6c 69 61 72 79 20 72 65 67 69 73 74 65  uxiliary registe
10850 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d  r.** and the num
10860 62 65 72 20 6f 66 20 74 68 61 74 20 72 65 67 69  ber of that regi
10870 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
10880 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74  .  On subsequent
10890 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20 72   calls,.** the r
108a0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
108b0 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 6f  s returned witho
108c0 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  ut generating an
108d0 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  y code..**.** No
108e0 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64 65 72  te that in order
108f0 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72   for this to wor
10900 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  k, code must be 
10910 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65  generated in the
10920 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72 20 74  .** same order t
10930 68 61 74 20 69 74 20 69 73 20 65 78 65 63 75 74  hat it is execut
10940 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65  ed..**.** Aliase
10950 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  s are numbered s
10960 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20  tarting with 1. 
10970 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20 69 6e   So iAlias is in
10980 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66   the range.** of
10990 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e 41   1 to pParse->nA
109a0 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65 2e 20  lias inclusive. 
109b0 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   .**.** pParse->
109c0 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
109d0 20 72 65 63 6f 72 64 73 20 74 68 65 20 72 65 67   records the reg
109e0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
109f0 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  re the value.** 
10a00 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68  of the iAlias-th
10a10 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72 65 64   alias is stored
10a20 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68 61 74  .  If zero, that
10a30 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a   means that the.
10a40 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e 6f 74  ** alias has not
10a50 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70 75 74   yet been comput
10a60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
10a70 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61 72 73  t codeAlias(Pars
10a80 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
10a90 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70 45 78  Alias, Expr *pEx
10aa0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
10ab0 0a 23 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33  .#if 0.  sqlite3
10ac0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10ad0 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a 20  b;.  int iReg;. 
10ae0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 41 6c   if( pParse->nAl
10af0 69 61 73 41 6c 6c 6f 63 3c 70 50 61 72 73 65 2d  iasAlloc<pParse-
10b00 3e 6e 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70  >nAlias ){.    p
10b10 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20  Parse->aAlias = 
10b20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
10b30 4f 72 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  OrFree(db, pPars
10b40 65 2d 3e 61 41 6c 69 61 73 2c 0a 20 20 20 20 20  e->aAlias,.     
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
10b70 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
10b80 73 5b 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41  s[0])*pParse->nA
10b90 6c 69 61 73 20 29 3b 0a 20 20 20 20 74 65 73 74  lias );.    test
10ba0 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
10bb0 46 61 69 6c 65 64 20 26 26 20 70 50 61 72 73 65  Failed && pParse
10bc0 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3e 30 20  ->nAliasAlloc>0 
10bd0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
10be0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
10bf0 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 73  turn 0;.    mems
10c00 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 6c 69  et(&pParse->aAli
10c10 61 73 5b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  as[pParse->nAlia
10c20 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a 20 20 20 20  sAlloc], 0,.    
10c30 20 20 20 20 20 20 20 28 70 50 61 72 73 65 2d 3e         (pParse->
10c40 6e 41 6c 69 61 73 2d 70 50 61 72 73 65 2d 3e 6e  nAlias-pParse->n
10c50 41 6c 69 61 73 41 6c 6c 6f 63 29 2a 73 69 7a 65  AliasAlloc)*size
10c60 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
10c70 73 5b 30 5d 29 29 3b 0a 20 20 20 20 70 50 61 72  s[0]));.    pPar
10c80 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 20  se->nAliasAlloc 
10c90 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  = pParse->nAlias
10ca0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10cb0 69 41 6c 69 61 73 3e 30 20 26 26 20 69 41 6c 69  iAlias>0 && iAli
10cc0 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 69  as<=pParse->nAli
10cd0 61 73 20 29 3b 0a 20 20 69 52 65 67 20 3d 20 70  as );.  iReg = p
10ce0 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41  Parse->aAlias[iA
10cf0 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66 28 20 69  lias-1];.  if( i
10d00 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Reg==0 ){.    if
10d10 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
10d20 4c 65 76 65 6c 3e 30 20 29 7b 0a 20 20 20 20 20  Level>0 ){.     
10d30 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
10d40 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
10d50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
10d60 67 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  get);.    }else{
10d70 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20 2b 2b  .      iReg = ++
10d80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10d90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10da0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10db0 72 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  r, iReg);.      
10dc0 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69  pParse->aAlias[i
10dd0 41 6c 69 61 73 2d 31 5d 20 3d 20 69 52 65 67 3b  Alias-1] = iReg;
10de0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10df0 75 72 6e 20 69 52 65 67 3b 0a 23 65 6c 73 65 0a  urn iReg;.#else.
10e00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10e10 45 52 28 69 41 6c 69 61 73 29 3b 0a 20 20 72 65  ER(iAlias);.  re
10e20 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
10e30 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
10e40 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
10e50 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
10e60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
10e70 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
10e80 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
10e90 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
10ea0 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
10eb0 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
10ec0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
10ed0 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
10ee0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
10ef0 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
10f00 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
10f10 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
10f20 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
10f30 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
10f40 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
10f50 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
10f60 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
10f70 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
10f80 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
10f90 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
10fa0 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
10fb0 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
10fc0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
10fd0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
10fe0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
10ff0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
11000 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
11010 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
11020 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
11030 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
11040 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
11050 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
11060 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
11070 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
11080 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
11090 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
110a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
110d0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
110e0 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
110f0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
11100 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
11110 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
11120 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
11130 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
11140 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
11150 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
11160 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
11170 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
11180 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
11190 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
111a0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
111b0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
111c0 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20   r2, r3, r4;    
111d0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
111e0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
111f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
11200 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
11210 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
11220 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  nnection */..  a
11230 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
11240 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
11250 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
11260 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
11270 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
11280 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
11290 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
112a0 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
112b0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
112c0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
112d0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
112e0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
112f0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
11300 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
11310 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
11320 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
11330 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
11340 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
11350 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
11360 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
11370 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
11380 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
11390 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
113a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
113b0 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
113c0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
113d0 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
113e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
113f0 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
11400 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
11410 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
11420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11430 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
11440 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
11450 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
11480 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
11490 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
114a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
114b0 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
114c0 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
114d0 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
114e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
114f0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
11500 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
11510 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
11520 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
11530 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
11540 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
11550 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
11560 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
11570 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20  kBase>0 );.     
11580 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
11590 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
115a0 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
115b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
115c0 20 74 65 73 74 63 61 73 65 28 20 28 70 45 78 70   testcase( (pExp
115d0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e  r->flags & EP_An
115e0 79 41 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20  yAff)!=0 );.    
115f0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
11600 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
11610 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
11620 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
11650 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  ->iColumn, pExpr
11660 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
11670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
116a0 26 20 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20  & EP_AnyAff);.  
116b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
116c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
116d0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
116e0 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
116f0 72 28 76 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  r(v, pExpr, 0, t
11700 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
11710 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11720 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
11730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
11740 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11750 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
11760 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
11770 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
11780 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
11790 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
117a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
117b0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
117c0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
117d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
117e0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
117f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11800 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11810 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
11820 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
11830 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
11840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11850 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
11860 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
11870 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11880 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
11890 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
118a0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
118b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
118c0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
118d0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
118e0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
118f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
11900 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
11910 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11920 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
11930 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
11940 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
11950 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
11960 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
11970 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
11980 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
11990 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
119a0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
119b0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
119c0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
119d0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
119e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
119f0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
11a00 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
11a10 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
11a20 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
11a30 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
11a40 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
11a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11a60 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
11a70 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
11a80 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
11a90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11aa0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
11ab0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
11ac0 45 3a 20 7b 0a 20 20 20 20 20 20 56 64 62 65 4f  E: {.      VdbeO
11ad0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 61 73  p *pOp;.      as
11ae0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
11af0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
11b00 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
11b10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
11b20 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
11b30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11b40 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
11b50 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  0]!=0 );.      i
11b60 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
11b70 65 6e 5b 31 5d 3d 3d 30 0a 20 20 20 20 20 20 20  en[1]==0.       
11b80 20 20 26 26 20 28 70 4f 70 20 3d 20 73 71 6c 69    && (pOp = sqli
11b90 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
11ba0 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
11bb0 5f 56 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20  _Variable.      
11bc0 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
11bd0 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d 3e 69 43  p->p3==pExpr->iC
11be0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26  olumn.         &
11bf0 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
11c00 33 3d 3d 74 61 72 67 65 74 0a 20 20 20 20 20 20  3==target.      
11c10 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d     && pOp->p4.z=
11c20 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
11c30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 72      /* If the pr
11c40 65 76 69 6f 75 73 20 69 6e 73 74 72 75 63 74 69  evious instructi
11c50 6f 6e 20 77 61 73 20 61 20 63 6f 70 79 20 6f 66  on was a copy of
11c60 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 75 6e   the previous un
11c70 6e 61 6d 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  named.        **
11c80 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74 6f 20   parameter into 
11c90 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 65 67  the previous reg
11ca0 69 73 74 65 72 2c 20 74 68 65 6e 20 73 69 6d 70  ister, then simp
11cb0 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ly increment the
11cc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65  .        ** repe
11cd0 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20  at count on the 
11ce0 70 72 69 6f 72 20 69 6e 73 74 72 75 63 74 69 6f  prior instructio
11cf0 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20 6d 61  n rather than ma
11d00 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20 20 20 20  king a new.     
11d10 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
11d20 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
11d30 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
11d40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11d60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 61  eAddOp3(v, OP_Va
11d70 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
11d80 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 2c 20  Column, target, 
11d90 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
11da0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
11db0 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
11dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11dd0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 45  angeP4(v, -1, pE
11de0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
11df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11e00 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11e20 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
11e30 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
11e40 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
11e50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11e60 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
11e70 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
11e80 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65  codeAlias(pParse
11e90 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
11ea0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
11eb0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
11ec0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
11ed0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
11ee0 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
11ef0 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
11f00 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
11f10 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
11f20 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
11f30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
11f40 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
11f50 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
11f60 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
11f70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
11f80 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
11f90 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
11fa0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
11fb0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
11fc0 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
11fd0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
11fe0 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
11ff0 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70  en);.      to_op
12000 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f   = aff - SQLITE_
12010 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f  AFF_TEXT + OP_To
12020 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Text;.      asse
12030 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
12040 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d  Text    || aff!=
12050 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
12060 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
12070 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
12080 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
12090 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
120a0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
120b0 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
120c0 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d  Numeric || aff!=
120d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
120e0 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  IC );.      asse
120f0 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
12100 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d  Int     || aff!=
12110 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
12120 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ER );.      asse
12130 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
12140 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
12150 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
12160 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74     );.      test
12170 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
12180 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20  ToText );.      
12190 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
121a0 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20  =OP_ToBlob );.  
121b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
121c0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
121d0 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c );.      testc
121e0 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
121f0 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  oInt );.      te
12200 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
12210 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20  P_ToReal );.    
12220 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
12230 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
12240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12250 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
12260 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
12270 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
12280 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
12290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
122a0 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
122b0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65  inReg);.      te
122c0 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
122d0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
122e0 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
122f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12300 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
12310 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
12320 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
12330 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12340 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12350 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
12360 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
12370 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
12380 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
12390 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
123a0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
123b0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
123c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
123d0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
123e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
123f0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
12400 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
12410 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
12420 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
12430 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
12440 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
12450 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12460 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
12470 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12480 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
12490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
124a0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
124b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
124c0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
124d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
124e0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
124f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
12500 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12510 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
12520 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
12530 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
12540 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12550 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
12590 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
125a0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
125b0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
125c0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
125d0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
125f0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
12600 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
12610 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12620 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
12630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
12640 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
12650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12660 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
12670 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
12680 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
12690 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
126a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
126b0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
126c0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
126d0 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
126e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
126f0 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
12700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
12730 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
12740 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
12750 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
12760 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
12770 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
12780 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
12790 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
127a0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
127b0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
127c0 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
127d0 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f  TOREP2 | SQLITE_
127e0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
127f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
12800 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
12810 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
12820 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
12830 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
12840 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
12850 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
12860 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
12870 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
12880 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
12890 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
128a0 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
128b0 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
128c0 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
128d0 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
128e0 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
128f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
12900 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
12910 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
12920 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
12930 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20  ==OP_And );.    
12940 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
12950 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20  =OP_Or );.      
12960 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
12970 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20  =OP_Add );.     
12980 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
12990 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
129a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
129b0 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
129c0 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73  nder );.      as
129d0 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
129e0 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20  =OP_BitAnd );.  
129f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
12a00 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
12a10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12a20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
12a30 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ide );.      ass
12a40 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
12a50 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
12a60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12a70 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
12a80 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  tRight );.      
12a90 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
12aa0 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a  T==OP_Concat );.
12ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12ac0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
12ad0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12ae0 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
12af0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12b00 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
12b10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12b20 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
12b30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12b40 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65  _REM );.      te
12b50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
12b60 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74  ITAND );.      t
12b70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12b80 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  BITOR );.      t
12b90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12ba0 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74  SLASH );.      t
12bb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12bc0 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
12bd0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12be0 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
12bf0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12c00 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
12c10 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
12c20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
12c30 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
12c40 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
12c50 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
12c60 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
12c70 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
12c80 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
12c90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12ca0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
12cb0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
12cc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12cd0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
12ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
12cf0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
12d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12d10 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
12d20 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
12d30 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
12d40 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
12d50 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
12d60 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
12d70 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
12d80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12d90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
12da0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
12db0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
12dc0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
12dd0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
12de0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
12df0 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
12e00 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
12e10 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
12e20 74 65 67 65 72 28 76 2c 20 70 4c 65 66 74 2c 20  teger(v, pLeft, 
12e30 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
12e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12e50 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d   regFree1 = r1 =
12e60 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12e70 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
12e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12ea0 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20  ger, 0, r1);.   
12eb0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
12ec0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
12ed0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
12ee0 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
12ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12f00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12f10 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
12f20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12f30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
12f40 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
12f50 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
12f60 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
12f70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12f80 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
12f90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
12fa0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
12fb0 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
12fc0 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  BitNot );.      
12fd0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
12fe0 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  OP_Not );.      
12ff0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13000 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
13010 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13020 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
13030 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
13040 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
13050 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
13060 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
13070 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
13080 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  e1==0 );.      i
13090 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
130a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
130b0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
130c0 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
130d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
130e0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
130f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
13100 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
13110 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73  t addr;.      as
13120 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
13130 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
13140 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
13150 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
13160 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ll );.      test
13170 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
13180 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
13190 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
131a0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
131b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
131c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
131d0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
131e0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
131f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13200 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13210 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
13220 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
13230 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
13240 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13250 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
13260 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
13270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13280 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
13290 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  get, -1);.      
132a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
132b0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
132c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
132d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
132e0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
132f0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66     AggInfo *pInf
13300 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
13310 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
13320 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
13330 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
13340 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
13350 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
13360 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13370 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13380 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
13390 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20  gregate: %s()", 
133a0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
133b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
133c0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
133d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
133e0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
133f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13400 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13410 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
13420 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
13430 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
13440 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
13450 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
13460 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
13470 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
13480 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
13490 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
134a0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
134b0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
134c0 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
134d0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
134e0 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
134f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
13500 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
13510 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
13520 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
13530 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a   name in bytes *
13540 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
13550 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
13560 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
13570 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ame */.      int
13580 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
13590 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
135a0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
135b0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
135c0 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
135d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
135e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
135f0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ter */.      u8 
13600 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
13610 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
13620 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
13630 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
13640 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
13650 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
13660 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
13670 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
13680 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
13690 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
136a0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
136b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
136c0 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46  ( op==TK_CONST_F
136d0 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UNC );.      tes
136e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55  tcase( op==TK_FU
136f0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
13700 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
13710 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
13720 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
13730 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
13740 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13750 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
13760 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
13770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
13780 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
13790 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
137a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
137b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
137c0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
137d0 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
137e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
137f0 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71  ;.      nId = sq
13800 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
13810 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  d);.      pDef =
13820 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
13830 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49  tion(db, zId, nI
13840 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
13850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
13860 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
13870 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13880 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
13890 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28   function: %.*s(
138a0 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  )", nId, zId);. 
138b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
138c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
138d0 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
138e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
138f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13900 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
13910 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
13920 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
13930 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
13940 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13960 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
13970 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
13980 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
13990 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
139a0 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20 2f  (pParse, 1);   /
139b0 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
139c0 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d  d34be */.      }
139d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
139e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
139f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13a00 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13a10 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
13a20 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
13a30 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
13a40 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
13a50 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
13a60 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
13a70 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13a80 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
13a90 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
13aa0 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
13ab0 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
13ac0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
13ad0 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
13ae0 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
13af0 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
13b00 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
13b10 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
13b20 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
13b30 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
13b40 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
13b50 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
13b60 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
13b70 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
13b80 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
13b90 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
13ba0 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
13bb0 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
13bc0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13bd0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
13be0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
13bf0 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
13c00 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
13c10 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
13c20 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
13c30 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
13c40 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
13c50 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
13c60 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
13c70 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
13c80 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
13c90 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
13ca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13cb0 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28  f( nFarg>=2 && (
13cc0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
13cd0 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
13ce0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
13cf0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
13d00 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
13d10 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
13d20 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  g->a[1].pExpr);.
13d30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13d40 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20  nFarg>0 ){.     
13d50 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
13d60 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
13d70 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
13d80 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
13d90 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
13da0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13db0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
13dc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13dd0 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
13de0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
13df0 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
13e00 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
13e10 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28    constMask |= (
13e20 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
13e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
13e40 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
13e50 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
13e60 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
13e70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
13e80 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13e90 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13ea0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
13eb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13ec0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
13ed0 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
13ee0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
13ef0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
13f00 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
13f10 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
13f20 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
13f30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13f40 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
13f50 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
13f60 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
13f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13f90 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
13fa0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
13fb0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13fd0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
13fe0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
13ff0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14000 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
14010 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
14020 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
14030 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14040 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
14050 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
14060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14070 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
14080 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
14090 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
140a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
140b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
140c0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
140d0 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
140e0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
140f0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
14100 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
14110 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
14120 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
14130 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  CT );.      inRe
14140 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
14150 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
14160 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
14170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14180 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
14190 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 4e  : {.      int rN
141a0 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 20  otFound = 0;.   
141b0 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
141c0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ull = 0;.      i
141d0 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20 6a  nt j2, j3, j4, j
141e0 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66  5;.      char af
141f0 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e  finity;.      in
14200 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 20 20  t eType;..      
14210 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14220 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
14230 70 72 20 72 25 64 22 2c 20 74 61 72 67 65 74 29  pr r%d", target)
14240 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
14250 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
14260 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
14270 72 2c 20 26 72 4d 61 79 48 61 76 65 4e 75 6c 6c  r, &rMayHaveNull
14280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  );.      if( rMa
14290 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
142a0 20 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64 20 3d       rNotFound =
142b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
142c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
142d0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
142e0 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
142f0 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
14300 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
14310 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ts.      ** of t
14320 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
14330 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
14340 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
14350 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
14360 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50       ** P4 of OP
14370 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20  _MakeRecord..   
14380 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69     */.      affi
14390 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
143a0 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
143b0 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  ;...      /* Cod
143c0 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  e the <expr> fro
143d0 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
143e0 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61  .)". The tempora
143f0 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  ry table.      *
14400 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
14410 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
14420 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
14430 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a   the (...) set..
14440 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14450 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14460 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
14470 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14480 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
14490 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
144a0 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c  ;.      j2 = sql
144b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
144c0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74 61 72  , OP_IsNull, tar
144d0 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
144e0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
144f0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
14500 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j3 = sqlite3Vdb
14510 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
14520 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65 74 29  stBeInt, target)
14530 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73  ;.        j4 = s
14540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14550 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
14560 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
14570 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
145a0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
145b0 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73  ;.        j5 = s
145c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
145d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
145e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
145f0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29  eJumpHere(v, j3)
14600 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14610 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14620 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71   j4);.        sq
14630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14640 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
14650 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14670 72 32 20 3d 20 72 65 67 46 72 65 65 32 20 3d 20  r2 = regFree2 = 
14680 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14690 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  g(pParse);..    
146a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
146b0 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73 74 20  record and test 
146c0 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68  for set membersh
146d0 69 70 2e 20 49 66 20 74 68 65 20 73 65 74 20 63  ip. If the set c
146e0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 20 20  ontains.        
146f0 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20 74 68  ** the value, th
14700 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  en jump to the e
14710 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74 20 63  nd of the test c
14720 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65 74 0a  ode. The target.
14730 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73          ** regis
14740 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ter still contai
14750 6e 73 20 74 68 65 20 74 72 75 65 20 28 31 29 20  ns the true (1) 
14760 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f  value written to
14770 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20 20 20   it earlier..   
14780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147a0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
147b0 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c 20 72  rd, target, 1, r
147c0 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
147d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
147e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
147f0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
14800 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  rget);.        j
14810 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  5 = sqlite3VdbeA
14820 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e  ddOp3(v, OP_Foun
14830 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
14840 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20 20 20  , 0, r2);..     
14850 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74     /* If the set
14860 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
14870 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
14880 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a   result of the .
14890 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20 49 4e          ** "x IN
148a0 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69   (...)" expressi
148b0 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  on must be eithe
148c0 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20  r 0 or NULL. If 
148d0 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
148e0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
148f0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
14900 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
14910 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
14920 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
14930 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
14940 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
14950 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14960 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
14970 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
14980 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  NULL..        */
14990 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 4e 6f  .        if( rNo
149a0 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20 20 20  tFound==0 ){.   
149b0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
149c0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
149d0 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
149e0 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77 29 20  pile time (now) 
149f0 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 20 20  that .          
14a00 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e 74 61  ** the set conta
14a10 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75  ins no NULL valu
14a20 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  es. This happens
14a30 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20   as the result. 
14a40 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
14a50 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
14a60 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61  traint in the da
14a70 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 4e  tabase schema. N
14a80 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20 20 20  o need.         
14a90 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
14aa0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 61  data structure a
14ab0 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74 68 69  t runtime in thi
14ac0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
14ad0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
14ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14af0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14b00 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
14b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14b20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
14b30 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65  ck populates the
14b40 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67 69 73   rNotFound regis
14b50 74 65 72 20 77 69 74 68 20 65 69 74 68 65 72 20  ter with either 
14b60 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 2a  NULL.          *
14b70 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74 65 67  * or 0 (an integ
14b80 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20 74 68  er value). If th
14b90 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
14ba0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a 20 20   contains one.  
14bb0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f          ** or mo
14bc0 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e 20 73  re NULLs, then s
14bd0 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74 6f 20  et rNotFound to 
14be0 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
14bf0 20 73 65 74 20 69 74 0a 20 20 20 20 20 20 20 20   set it.        
14c00 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20 72 65    ** to 0. If re
14c10 67 69 73 74 65 72 20 72 4d 61 79 48 61 76 65 4e  gister rMayHaveN
14c20 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79 20 73  ull is already s
14c30 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
14c40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74  .          ** ot
14c50 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c 20 74  her than NULL, t
14c60 68 65 6e 20 74 68 65 20 74 65 73 74 20 68 61 73  hen the test has
14c70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 75   already been ru
14c80 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 20  n and .         
14c90 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20 69 73   ** rNotFound is
14ca0 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
14cb0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
14cc0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
14cd0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c  c const char nul
14ce0 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20 30 78  lRecord[] = { 0x
14cf0 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20  02, 0x00 };.    
14d00 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
14d10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14d20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d 61 79  OP_NotNull, rMay
14d30 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
14d40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
14d60 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29  l, 0, rNotFound)
14d70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14d80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14d90 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72 4d 61   OP_Blob, 2, rMa
14da0 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20 0a 20  yHaveNull, 0, . 
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c              null
14dd0 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41 54 49  Record, P4_STATI
14de0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 34  C);.          j4
14df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14e00 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  dOp3(v, OP_Found
14e10 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
14e20 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   0, rMayHaveNull
14e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14e50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
14e60 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20   rNotFound);.   
14e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14e80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34  beJumpHere(v, j4
14e90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14ea0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14eb0 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20 20 20  (v, j3);..      
14ec0 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
14ed0 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
14ee0 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77 68 69  r rNotFound (whi
14ef0 63 68 20 69 73 20 65 69 74 68 65 72 20 4e 55 4c  ch is either NUL
14f00 4c 20 6f 72 20 30 29 0a 20 20 20 20 20 20 20 20  L or 0).        
14f10 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 74 61    ** into the ta
14f20 72 67 65 74 20 72 65 67 69 73 74 65 72 2e 20 54  rget register. T
14f30 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
14f40 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
14f50 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
14f60 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20  ssion..         
14f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
14f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14f90 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e 6f 74  v, OP_Copy, rNot
14fa0 46 6f 75 6e 64 2c 20 74 61 72 67 65 74 29 3b 0a  Found, target);.
14fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14fc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
14fd0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
14fe0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
14ff0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15000 20 6a 35 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j5);.      sqli
15010 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
15020 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
15030 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
15040 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 20 72  , "end IN expr r
15050 25 64 22 2c 20 74 61 72 67 65 74 29 29 3b 0a 20  %d", target));. 
15060 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15070 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a  }.#endif.    /*.
15080 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
15090 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
150a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
150b0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
150c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
150d0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
150e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
150f0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
15100 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
15110 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
15120 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
15130 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
15140 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
15150 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
15160 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
15170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
15180 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
15190 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
151a0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
151b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
151c0 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
151d0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
151e0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
151f0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
15200 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 63 6f 64  Expr;..      cod
15210 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
15220 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
15230 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26    pRight, &r2, &
15270 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
15280 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15290 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
152a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
152b0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e2==0 );.      r
152c0 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
152d0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
152e0 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65       r4 = sqlite
152f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
15300 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  se);.      codeC
15310 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
15320 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
15330 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _Ge,.           
15340 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72         r1, r2, r
15350 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  3, SQLITE_STOREP
15360 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  2);.      pLItem
15370 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
15380 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
15390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
153a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
153b0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
153c0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
153d0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
153e0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
153f0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
15400 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15410 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
15420 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
15430 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
15440 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
15450 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54  2, r4, SQLITE_ST
15460 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71  OREP2);.      sq
15470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15480 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
15490 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  4, target);.    
154a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
154b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
154c0 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r3);.      sqlit
154d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
154e0 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20  (pParse, r4);.  
154f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
15510 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
15520 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
15530 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
15540 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15550 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
15560 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15570 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
15580 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
15590 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
155a0 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
155b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
155c0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
155d0 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
155e0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
155f0 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
15600 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
15610 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
15620 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
15630 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
15640 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
15650 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
15660 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
15670 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
15680 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
15690 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
156a0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
156b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
156c0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
156d0 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
156e0 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
156f0 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
15700 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
15710 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
15720 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
15730 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
15740 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
15750 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
15760 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
15770 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
15780 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
15790 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
157a0 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
157b0 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
157c0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
157d0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
157e0 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
157f0 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
15800 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
15810 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
15820 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
15830 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
15840 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
15850 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
15860 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
15870 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
15880 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
15890 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
158a0 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
158b0 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
158c0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
158d0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
158e0 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
158f0 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
15900 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
15910 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
15920 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
15930 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
15940 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
15950 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
15960 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
15970 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15980 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
15990 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
159a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
159b0 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
159c0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
159d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
159e0 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
159f0 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
15a00 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
15a10 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
15a20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
15a30 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
15a40 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
15a50 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
15a60 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
15a70 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
15a80 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
15a90 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
15aa0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
15ab0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
15ac0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
15ad0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
15ae0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
15af0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
15b00 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
15b10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
15b20 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
15b30 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
15b40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
15b50 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
15b60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
15b70 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
15b80 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
15b90 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
15ba0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
15bb0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
15bc0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
15bd0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
15be0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
15bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15c00 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
15c10 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
15c20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
15c30 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
15c40 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
15c50 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
15c60 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
15c70 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
15c80 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
15c90 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
15ca0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
15cb0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
15cc0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
15cd0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
15ce0 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
15cf0 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
15d00 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
15d10 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
15d20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
15d30 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
15d40 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
15d50 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
15d60 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  l.  */.      if(
15d70 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
15d80 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
15d90 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
15da0 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
15db0 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
15dc0 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
15dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15de0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
15df0 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
15e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15e10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
15e20 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
15e30 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
15e40 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
15e50 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
15e60 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
15e70 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
15e80 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
15e90 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
15ea0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
15eb0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
15ec0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
15ed0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
15ee0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
15ef0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
15f00 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
15f10 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
15f20 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
15f30 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
15f40 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
15f50 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
15f60 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
15f70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
15f80 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
15f90 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
15fa0 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
15fb0 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
15fc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
15fd0 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78    ** Y is in pEx
15fe0 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65  pr->pRight.  The
15ff0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
16000 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69  nal.  If there i
16010 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45  s no.    ** ELSE
16020 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f   clause and no o
16030 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65  ther term matche
16040 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
16050 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  lt of the.    **
16060 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55   exprssion is NU
16070 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
16080 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
16090 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
160a0 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
160b0 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
160c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
160d0 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
160e0 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
160f0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
16100 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
16110 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
16120 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
16130 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
16140 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
16150 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
16160 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
16170 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
16180 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
16190 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
161a0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
161d0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
161e0 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
161f0 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16210 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
16220 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
16230 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
16240 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16260 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
16270 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
16280 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
162b0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
162c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162e0 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
162f0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
16300 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16310 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
16320 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
16330 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
16340 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
16370 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
16380 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20    Expr cacheX;  
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78      /* Cached ex
163b0 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20  pression X */.  
163c0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
163f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
16400 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
16410 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16420 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
16430 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
16440 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
16450 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
16460 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
16470 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
16480 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
16490 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
164a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
164b0 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
164c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
164d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
164e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
164f0 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
16500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
16510 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
16520 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
16530 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
16540 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
16550 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
16560 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
16570 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
16580 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
16590 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
165a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
165b0 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
165c0 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
165d0 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20  .        cacheX 
165e0 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
165f0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
16600 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
16610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16620 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pX->op==TK_REGIS
16630 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63  TER );.        c
16640 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73  acheX.iTable = s
16650 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16660 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26  mp(pParse, pX, &
16670 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
16680 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16690 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
166a0 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20      cacheX.op = 
166b0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
166c0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
166d0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
166e0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
166f0 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20  ft = &cacheX;.  
16700 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
16710 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
16720 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
16730 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
16740 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16750 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
16760 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
16770 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
16780 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
16790 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
167a0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
167b0 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
167c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
167d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
167e0 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
167f0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
16800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16810 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
16820 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16830 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
16840 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d  case( pTest->op=
16850 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
16860 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16870 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16880 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65   pTest, nextCase
16890 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
168a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ULL);.        te
168b0 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
168c0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
168d0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
168e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
168f0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
16900 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
16910 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
16920 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16930 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
16940 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
16950 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
16960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16970 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16980 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
16990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
169a0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
169b0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
169c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
169d0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
169e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
169f0 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
16a00 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ht ){.        sq
16a10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
16a20 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
16a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16a40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
16a50 72 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67 65  r->pRight, targe
16a60 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
16a70 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
16a80 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
16a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ab0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
16ac0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16ad0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
16ae0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16af0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
16b00 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  r>0 .           
16b10 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  || pParse->iCach
16b20 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65  eLevel==iCacheLe
16b30 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  vel );.      sql
16b40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16b50 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
16b60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16b70 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
16b80 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
16b90 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
16ba0 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
16bb0 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
16bc0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
16bd0 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
16be0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
16bf0 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
16c00 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
16c10 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
16c20 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
16c30 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
16c40 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
16c50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
16c60 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
16c70 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
16c80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16c90 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
16cb0 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
16cc0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
16cd0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
16ce0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
16cf0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
16d00 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
16d10 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
16d20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16d30 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
16d40 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
16d50 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
16d60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16d70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
16d80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
16d90 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
16da0 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
16db0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16dc0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
16dd0 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
16de0 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
16df0 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
16e00 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
16e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16e20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
16e30 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 70 45  raint(pParse, pE
16e40 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
16e50 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
16e60 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
16e70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16e80 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
16e90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16ea0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
16eb0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
16ec0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16ed0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
16ee0 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
16ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16f00 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
16f10 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
16f20 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
16f30 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
16f40 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
16f50 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
16f60 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
16f70 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
16f80 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
16f90 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
16fa0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
16fb0 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
16fc0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
16fd0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
16fe0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
16ff0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
17000 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
17010 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
17020 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
17030 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  eg to zero..*/.i
17040 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
17050 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
17060 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
17070 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
17080 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
17090 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
170a0 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20  se);.  int r2 = 
170b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
170c0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
170d0 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20  xpr, r1);.  if( 
170e0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70  r2==r1 ){.    *p
170f0 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73  Reg = r1;.  }els
17100 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  e{.    sqlite3Re
17110 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17120 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70  rse, r1);.    *p
17130 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Reg = 0;.  }.  r
17140 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
17150 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
17160 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
17170 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
17180 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
17190 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
171a0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
171b0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
171c0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
171d0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
171e0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
171f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
17200 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
17210 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
17220 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
17230 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
17240 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
17250 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
17260 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52  e->nMem );.  inR
17270 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
17280 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
17290 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
172a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
172b0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
172c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
172d0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
172e0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
172f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
17300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17310 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
17320 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
17330 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
17340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61  .  }.  return ta
17350 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rget;.}../*.** G
17360 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
17370 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
17380 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
17390 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
173a0 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
173b0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
173c0 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
173d0 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
173e0 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
173f0 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
17400 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
17410 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
17420 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
17430 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
17440 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
17450 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
17460 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
17470 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
17480 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17490 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
174a0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
174b0 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
174c0 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
174d0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
174e0 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
174f0 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
17500 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
17510 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17520 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
17530 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
17540 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
17550 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
17560 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
17570 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52  pVdbe;.  int inR
17580 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71  eg;.  inReg = sq
17590 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
175a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
175b0 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
175c0 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a  target>0 );.  /*
175d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
175e0 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d   called for term
175f0 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55  s to INSERT or U
17600 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20  PDATE.  And the 
17610 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20  only.  ** other 
17620 70 6c 61 63 65 20 77 68 65 72 65 20 65 78 70 72  place where expr
17630 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63  essions can be c
17640 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
17650 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a  _REGISTER is.  *
17660 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  * in WHERE claus
17670 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53  e processing.  S
17680 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69  o as currently i
17690 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72  mplemented, ther
176a0 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79  e is.  ** no way
176b0 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54   for a TK_REGIST
176c0 45 52 20 74 6f 20 65 78 69 73 74 20 68 65 72 65  ER to exist here
176d0 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d 73 20  .  But it seems 
176e0 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  prudent to.  ** 
176f0 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59 53 28  keep the ALWAYS(
17700 29 20 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f  ) in case the co
17710 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63  nditions above c
17720 68 61 6e 67 65 20 77 69 74 68 20 66 75 74 75 72  hange with futur
17730 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74  e.  ** modificat
17740 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d  ions or enhancem
17750 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41  ents. */.  if( A
17760 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21  LWAYS(pExpr->op!
17770 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b  =TK_REGISTER) ){
17780 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b    .    int iMem;
17790 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  .    iMem = ++pP
177a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
177b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
177c0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e  2(v, OP_Copy, in
177d0 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  Reg, iMem);.    
177e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
177f0 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d  iMem;.    pExpr-
17800 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
17810 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
17820 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
17830 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65   }.  return inRe
17840 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  g;.}../*.** Retu
17850 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72  rn TRUE if pExpr
17860 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20   is an constant 
17870 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
17880 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  is appropriate.*
17890 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  * for factoring 
178a0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20  out of a loop.  
178b0 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72  Appropriate expr
178c0 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a  essions are:.**.
178d0 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70  **    *  Any exp
178e0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61  ression that eva
178f0 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72  luates to two or
17900 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a   more opcodes..*
17910 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f  *.**    *  Any O
17920 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65  P_Integer, OP_Re
17930 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f  al, OP_String, O
17940 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c  P_Blob, OP_Null,
17950 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50   .**       or OP
17960 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64  _Variable that d
17970 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
17980 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a  be placed in a .
17990 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69  **       specifi
179a0 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  c register..**.*
179b0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
179c0 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67  int in factoring
179d0 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74   out single-inst
179e0 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
179f0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
17a00 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
17a10 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74  placed in a part
17a20 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
17a30 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66    .** We could f
17a40 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20  actor them out, 
17a50 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c  but then we woul
17a60 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20  d end up adding 
17a70 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69  an.** OP_SCopy i
17a80 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f  nstruction to mo
17a90 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ve the value int
17aa0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  o the correct re
17ab0 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e  gister.** later.
17ac0 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65    We might as we
17ad0 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20  ll just use the 
17ae0 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63  original instruc
17af0 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69  tion and.** avoi
17b00 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a  d the OP_SCopy..
17b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
17b20 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
17b30 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29  ctoring(Expr *p)
17b40 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  {.  if( !sqlite3
17b50 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
17b60 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20  tJoin(p) ){.    
17b70 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e  return 0;  /* On
17b80 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  ly constant expr
17b90 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72  essions are appr
17ba0 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74  opriate for fact
17bb0 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  oring */.  }.  i
17bc0 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  f( (p->flags & E
17bd0 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20  P_FixedDest)==0 
17be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
17bf0 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e    /* Any constan
17c00 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65  t without a fixe
17c10 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  d destination is
17c20 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
17c30 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
17c40 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
17c50 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73   = p->pLeft;.  s
17c60 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
17c70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17c80 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
17c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
17ca0 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  B:.#endif.    ca
17cb0 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a  se TK_VARIABLE:.
17cc0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
17cd0 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
17ce0 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
17cf0 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61   TK_NULL:.    ca
17d00 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
17d10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17d20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29  p->op==TK_BLOB )
17d30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17d40 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ( p->op==TK_VARI
17d50 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  ABLE );.      te
17d60 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17d70 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  K_INTEGER );.   
17d80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
17d90 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a  op==TK_FLOAT );.
17da0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17db0 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29  p->op==TK_NULL )
17dc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17dd0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
17de0 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53  NG );.      /* S
17df0 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
17e00 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  n constants with
17e10 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
17e20 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a  tion are.      *
17e30 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e  * better done in
17e40 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61  -line.  If we fa
17e50 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20  ctor them, they 
17e60 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20  will just end.  
17e70 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61      ** up genera
17e80 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79  ting an OP_SCopy
17e90 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
17ea0 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e  ue to the destin
17eb0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ation.      ** r
17ec0 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20  egister. */.    
17ed0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
17ee0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
17ef0 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66  INUS: {.      if
17f00 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ( p->pLeft->op==
17f10 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70  TK_FLOAT || p->p
17f20 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
17f30 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
17f40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
17f50 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
17f60 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
17f70 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
17f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17f90 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
17fa0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
17fb0 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
17fc0 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  n that is approp
17fd0 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63  riate for.** fac
17fe0 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20  toring out of a 
17ff0 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75  loop, then evalu
18000 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
18010 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  on.** into a reg
18020 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  ister and conver
18030 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
18040 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53   into a TK_REGIS
18050 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  TER.** expressio
18060 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
18070 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57   evalConstExpr(W
18080 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
18090 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
180a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
180b0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
180c0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
180d0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
180e0 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65   TK_IN:.    case
180f0 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
18100 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
18110 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
18120 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
18130 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
18140 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
18150 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
18160 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  FUNC: {.      /*
18170 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
18180 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76  o a function hav
18190 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  e a fixed destin
181a0 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ation..      ** 
181b0 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77  Mark them this w
181c0 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65  ay to avoid gene
181d0 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f  rated unneeded O
181e0 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a  P_SCopy.      **
181f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a   instructions. .
18200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
18210 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
18220 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
18230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18240 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18250 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18260 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
18270 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
18280 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
18290 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
182a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
182b0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
182c0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
182d0 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c   for(; i>0; i--,
182e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
182f0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
18300 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20  pItem->pExpr) ) 
18310 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c  pItem->pExpr->fl
18320 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44  ags |= EP_FixedD
18330 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  est;.        }. 
18340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
18350 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
18360 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74  if( isAppropriat
18370 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45  eForFactoring(pE
18380 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
18390 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
183a0 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b  Mem;.    int r2;
183b0 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
183c0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
183d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
183e0 31 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  1);.    if( NEVE
183f0 52 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c 69  R(r1!=r2) ) sqli
18400 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18410 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18420 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
18430 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
18440 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
18450 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70  GISTER;.    pExp
18460 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a  r->iTable = r2;.
18470 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
18480 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
18490 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
184a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61  .}../*.** Preeva
184b0 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73  luate constant s
184c0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69  ubexpressions wi
184d0 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73  thin pExpr and s
184e0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
184f0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73  lts in registers
18500 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20  .  Modify pExpr 
18510 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  so that the cons
18520 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f  tant subexpresio
18530 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47  ns.** are TK_REG
18540 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68  ISTER opcodes th
18550 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
18560 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75  precomputed valu
18570 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
18580 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
18590 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61 72  ants(Parse *pPar
185a0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
185b0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
185c0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
185d0 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b  = evalConstExpr;
185e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
185f0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50  back = 0;.  w.pP
18600 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
18610 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
18620 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
18630 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18640 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
18650 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
18660 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
18670 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
18680 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
18690 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
186a0 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
186b0 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
186c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
186d0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
186e0 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
186f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
18700 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
18710 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18720 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
18730 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
18740 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
18750 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
18760 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
18770 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
18780 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
18790 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
187a0 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72  s */.  int doHar
187b0 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b  dCopy     /* Mak
187c0 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66  e a hard copy of
187d0 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a   every element *
187e0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
187f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
18800 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  em;.  int i, n;.
18810 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
18820 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18830 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20  target>0 );.  n 
18840 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
18850 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
18860 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
18870 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
18880 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 41     if( pItem->iA
18890 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 69 6e  lias ){.      in
188a0 74 20 69 52 65 67 20 3d 20 63 6f 64 65 41 6c 69  t iReg = codeAli
188b0 61 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  as(pParse, pItem
188c0 2d 3e 69 41 6c 69 61 73 2c 20 70 49 74 65 6d 2d  ->iAlias, pItem-
188d0 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69  >pExpr, target+i
188e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  );.      Vdbe *v
188f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
18900 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
18910 20 69 66 28 20 69 52 65 67 21 3d 74 61 72 67 65   if( iReg!=targe
18920 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t+i ){.        s
18930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18940 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52  (v, OP_SCopy, iR
18950 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
18960 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
18970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
18980 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
18990 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61  pItem->pExpr, ta
189a0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  rget+i);.    }. 
189b0 20 20 20 69 66 28 20 64 6f 48 61 72 64 43 6f 70     if( doHardCop
189c0 79 20 26 26 20 21 70 50 61 72 73 65 2d 3e 64 62  y && !pParse->db
189d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
189e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
189f0 78 70 72 48 61 72 64 43 6f 70 79 28 70 50 61 72  xprHardCopy(pPar
18a00 73 65 2c 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a  se, target, n);.
18a10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18a20 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
18a30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
18a40 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
18a50 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
18a60 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
18a70 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
18a80 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
18a90 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
18aa0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
18ab0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
18ac0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
18ad0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
18ae0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
18af0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
18b00 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
18b10 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
18b20 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
18b30 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
18b40 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
18b50 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
18b60 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
18b70 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
18b80 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
18b90 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
18ba0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
18bb0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
18bc0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
18bd0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
18be0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
18bf0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
18c00 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
18c10 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
18c20 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
18c30 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
18c40 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
18c50 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
18c60 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
18c70 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
18c80 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
18c90 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
18ca0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
18cb0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
18cc0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
18cd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
18ce0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
18cf0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
18d00 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
18d10 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
18d20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
18d30 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
18d40 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
18d50 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
18d60 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
18d70 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
18d80 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
18d90 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
18da0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
18db0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
18dc0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
18dd0 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
18de0 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45  xistance of VDBE
18df0 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
18e00 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
18e10 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
18e20 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
18e30 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
18e40 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
18e50 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
18e60 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
18e70 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
18e80 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
18e90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18ea0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18eb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
18ec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18ed0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
18ee0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
18ef0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
18f00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
18f10 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
18f20 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
18f30 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
18f40 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
18f50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
18f60 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
18f70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
18f80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18f90 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
18fa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18fb0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
18fc0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
18fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18fe0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
18ff0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
19000 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
19010 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
19020 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
19030 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
19040 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19050 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
19060 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
19070 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
19080 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
19090 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
190a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
190b0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
190c0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
190d0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
190e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
190f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
19100 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
19110 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
19120 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19130 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
19140 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
19150 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
19160 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
19170 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
19180 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
19190 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
191a0 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
191b0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
191c0 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
191d0 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
191e0 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
191f0 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
19200 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
19210 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
19220 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19230 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
19240 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19250 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
19260 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19270 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
19280 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19290 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
192a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
192b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
192c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
192d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
192e0 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
192f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
19300 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
19310 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
19320 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c  Operands(pParse,
19330 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
19340 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
19380 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
19390 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
193a0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
193b0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
193c0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
193e0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
193f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
19400 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19410 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
19420 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
19430 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
19440 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19450 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
19460 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
19470 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
19480 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
19490 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
194a0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
194b0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
194c0 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45  rands(pParse, pE
194d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c  xpr->pLeft, &r1,
194e0 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20   &regFree1,.    
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
19510 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32  xpr->pRight, &r2
19520 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
19530 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
19540 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
19550 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_NE;.      code
19560 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
19570 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
19580 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
19590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
195a0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
195b0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
195c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
195d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
195e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
195f0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
19600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19610 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
19620 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
19630 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
19640 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
19650 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
19660 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19670 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
19680 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
19690 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
196a0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
196b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
196c0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
196d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
196e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
196f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
19700 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
19710 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19720 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
19730 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
19740 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19750 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
19760 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19770 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
19780 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20  {.      /*    x 
19790 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
197a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
197b0 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * Is equivalent 
197c0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to .      **.   
197d0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
197e0 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a  D x<=z.      **.
197f0 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74        ** Code it
19800 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
19810 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
19820 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
19830 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c  sion.      ** el
19840 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
19850 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19860 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20  Expr exprAnd;.  
19870 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66      Expr compLef
19880 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  t;.      Expr co
19890 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45  mpRight;.      E
198a0 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20  xpr exprX;..    
198b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
198c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
198d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
198e0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 20 3d  );.      exprX =
198f0 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
19900 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f 70        exprAnd.op
19910 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
19920 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
19930 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20   &compLeft;.    
19940 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
19950 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
19960 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70       compLeft.op
19970 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20   = TK_GE;.      
19980 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
19990 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63   &exprX;.      c
199a0 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
199b0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
199c0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
199d0 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20     compRight.op 
199e0 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63  = TK_LE;.      c
199f0 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
19a00 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63   &exprX;.      c
19a10 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
19a20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
19a30 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
19a40 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65      exprX.iTable
19a50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19a60 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
19a70 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
19a80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19a90 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
19aa0 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70  ;.      exprX.op
19ab0 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
19ac0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19ad0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
19ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19af0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
19b00 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
19b10 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
19b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19b30 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
19b40 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
19b50 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
19b60 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
19b70 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
19b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b90 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
19ba0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
19bb0 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
19bc0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19bd0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
19be0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
19bf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
19c00 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
19c10 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19c20 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
19c30 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
19c40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19c50 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
19c60 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
19c70 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
19c80 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
19c90 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
19ca0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
19cb0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
19cc0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
19cd0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
19ce0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
19cf0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
19d00 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
19d10 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
19d20 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
19d30 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
19d40 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
19d50 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
19d60 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
19d70 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
19d80 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
19d90 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
19da0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
19db0 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
19dc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
19dd0 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
19de0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
19df0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
19e00 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
19e10 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19e20 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
19e30 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
19e40 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
19e50 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
19e60 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
19e70 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
19e80 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
19e90 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
19ea0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
19eb0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
19ec0 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
19ed0 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ance of VDBE che
19ee0 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
19ef0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
19f00 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
19f10 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
19f20 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
19f30 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
19f40 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
19f50 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
19f60 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
19f70 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
19f80 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
19f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
19fa0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
19fb0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
19fc0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
19fd0 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
19fe0 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
19ff0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
1a000 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
1a010 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1a030 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
1a040 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
1a050 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
1a060 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
1a070 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
1a080 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
1a090 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
1a0a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1a0c0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
1a0d0 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
1a0e0 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
1a0f0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
1a100 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
1a110 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
1a120 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1a130 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
1a140 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
1a150 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
1a160 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
1a170 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1a180 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
1a190 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
1a1a0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
1a1b0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
1a1c0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
1a1d0 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
1a1e0 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
1a1f0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
1a200 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
1a210 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
1a220 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1a230 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
1a240 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1a250 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
1a260 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1a270 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a280 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
1a290 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
1a2a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1a2b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
1a2c0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
1a2d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1a2e0 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
1a2f0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
1a300 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1a310 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
1a320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1a330 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
1a340 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
1a350 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a360 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
1a370 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
1a380 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1a390 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
1a3a0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
1a3b0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1a3c0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1a3d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a3e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1a3f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a400 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1a410 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1a420 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1a430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a440 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1a450 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1a460 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1a470 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1a480 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a490 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1a4a0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1a4b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a4c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a4d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1a4e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a4f0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a500 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1a510 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1a520 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a530 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
1a540 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1a550 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1a560 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1a570 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1a580 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1a590 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1a5a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a5b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1a5c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a5d0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1a5e0 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1a5f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a600 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1a610 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a620 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1a630 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1a640 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a650 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a660 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1a670 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1a680 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1a690 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1a6a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1a6b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1a6c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1a6d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
1a6e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a6f0 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
1a700 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1a710 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
1a720 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1a730 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
1a740 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
1a750 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
1a760 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
1a770 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a780 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1a790 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1a7a0 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
1a7b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1a7c0 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
1a7d0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
1a800 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
1a810 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
1a820 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1a830 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1a840 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1a870 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1a880 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1a890 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1a8a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1a8b0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1a8c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a8d0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1a8e0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1a8f0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1a900 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1a910 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1a920 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1a930 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1a940 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f      codeCompareO
1a950 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20  perands(pParse, 
1a960 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1a970 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20  1, &regFree1,.  
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1a9b0 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  r2, &regFree2);.
1a9c0 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
1a9d0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
1a9e0 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
1a9f0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1aa00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1aa10 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1aa20 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1aa40 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1aa50 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1aa60 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1aa70 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1aa80 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1aa90 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1aaa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1aab0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1aac0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1aad0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  LL: {.      test
1aae0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1aaf0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1ab00 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1ab10 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1ab20 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ab30 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ab40 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1ab50 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1ab60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ab70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1ab80 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1ab90 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1aba0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1abb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1abc0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1abd0 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45     /*    x BETWE
1abe0 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20  EN y AND z.     
1abf0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20   **.      ** Is 
1ac00 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
1ac10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1ac20 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
1ac30 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
1ac40 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73   ** Code it as s
1ac50 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1ac60 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1ac70 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1ac80 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
1ac90 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20  ation of x..    
1aca0 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
1acb0 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45  exprAnd;.      E
1acc0 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20  xpr compLeft;.  
1acd0 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67      Expr compRig
1ace0 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65  ht;.      Expr e
1acf0 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61 73 73  xprX;..      ass
1ad00 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1ad10 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ad20 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1ad30 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78      exprX = *pEx
1ad40 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1ad50 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1ad60 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72  _AND;.      expr
1ad70 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
1ad80 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
1ad90 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
1ada0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
1adb0 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
1adc0 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  _GE;.      compL
1add0 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1ade0 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  rX;.      compLe
1adf0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
1ae00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1ae10 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f  .pExpr;.      co
1ae20 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
1ae30 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  LE;.      compRi
1ae40 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
1ae50 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  rX;.      compRi
1ae60 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1ae70 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1ae80 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ].pExpr;.      e
1ae90 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  xprX.iTable = sq
1aea0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1aeb0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
1aec0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1aed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1aee0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1aef0 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b     exprX.op = TK
1af00 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
1af10 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1af20 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1af30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1af40 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
1af50 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1af60 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1af70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1af80 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1af90 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1afa0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1afb0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1afc0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1afd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1afe0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
1aff0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
1b000 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      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 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1b040 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1b050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1b060 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b070 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1b080 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1b090 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1b0a0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1b0b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1b0c0 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
1b0d0 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
1b0e0 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
1b0f0 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
1b100 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
1b110 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
1b120 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
1b130 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
1b140 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65   way..**.** Some
1b150 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
1b160 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46  ne will return F
1b170 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74 68 65  ALSE even if the
1b180 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1b190 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
1b1a0 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
1b1b0 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
1b1c0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
1b1d0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
1b1e0 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
1b1f0 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65  FALSE just to be
1b200 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
1b210 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1b220 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65  turns false, the
1b230 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
1b240 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
1b250 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
1b260 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
1b270 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
1b280 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 54  t if you get a T
1b290 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  RUE return, then
1b2a0 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
1b2b0 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
1b2c0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1b2d0 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
1b2e0 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
1b2f0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
1b300 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
1b310 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
1b320 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a   FALSE - that.**
1b330 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
1b340 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
1b350 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
1b360 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
1b370 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
1b380 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20  TRUE could lead 
1b390 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
1b3a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b3b0 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
1b3c0 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
1b3d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b3e0 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a  pA==0||pB==0 ){.
1b3f0 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
1b400 41 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  A;.  }.  assert(
1b410 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1b420 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65  erty(pA, EP_Toke
1b430 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1b440 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
1b450 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1b460 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f  ty(pB, EP_TokenO
1b470 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1b480 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
1b490 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1b4a0 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78  xIsSelect) || Ex
1b4b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1b4c0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1b4d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1b4e0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
1b4f0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1b500 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
1b510 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
1b520 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1b530 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
1b540 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1b550 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
1b560 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
1b570 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
1b580 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
1b590 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1b5a0 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
1b5b0 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
1b5c0 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20 70 41  urn 0;..  if( pA
1b5d0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 42 2d  ->x.pList && pB-
1b5e0 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
1b5f0 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 2d  if( pA->x.pList-
1b600 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78 2e 70 4c  >nExpr!=pB->x.pL
1b610 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
1b620 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
1b630 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70 4c 69 73  =0; i<pA->x.pLis
1b640 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b650 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1b660 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c 69 73 74  rA = pA->x.pList
1b670 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1b680 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
1b690 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2d 3e   = pB->x.pList->
1b6a0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1b6b0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
1b6c0 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
1b6d0 2c 20 70 45 78 70 72 42 29 20 29 20 72 65 74 75  , pExprB) ) retu
1b6e0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 0;.    }.  }e
1b6f0 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c  lse if( pA->x.pL
1b700 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70 4c 69  ist || pB->x.pLi
1b710 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
1b720 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
1b730 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
1b740 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
1b750 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
1b760 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
1b770 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1b780 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74 56 61  rty(pA, EP_IntVa
1b790 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  lue) ){.    if( 
1b7a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b7b0 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pB, EP_IntValue
1b7c0 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75  ) || pA->u.iValu
1b7d0 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e!=pB->u.iValue 
1b7e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b7f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
1b800 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
1b810 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
1b820 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
1b830 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1b840 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75  y(pB, EP_IntValu
1b850 65 29 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  e) || NEVER(pB->
1b860 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72  u.zToken==0) ) r
1b870 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
1b880 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1b890 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
1b8a0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
1b8b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1b8c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b8d0 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 1;.}.../*.**
1b8e0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
1b8f0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
1b900 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
1b910 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1b920 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
1b930 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
1b940 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
1b950 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
1b960 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
1b970 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
1b980 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
1b990 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
1b9a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
1b9b0 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
1b9c0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1b9d0 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
1b9e0 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
1b9f0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
1ba00 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
1ba10 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20         3,.      
1ba20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
1ba30 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1ba40 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20  >nColumnAlloc,. 
1ba50 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1ba60 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
1ba70 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1ba80 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1ba90 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1baa0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
1bab0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
1bac0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
1bad0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
1bae0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
1baf0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
1bb00 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
1bb10 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
1bb20 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
1bb30 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
1bb40 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
1bb50 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1bb60 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
1bb70 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
1bb80 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
1bb90 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
1bba0 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
1bbb0 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  3,.       &pInfo
1bbc0 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
1bbd0 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c  &pInfo->nFuncAll
1bbe0 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
1bbf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
1bc00 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
1bc10 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
1bc20 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
1bc30 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
1bc40 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
1bc50 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
1bc60 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1bc70 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
1bc80 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1bc90 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
1bca0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1bcb0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1bcc0 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
1bcd0 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
1bce0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
1bcf0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
1bd00 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
1bd10 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
1bd20 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
1bd30 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
1bd40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1bd50 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
1bd60 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
1bd70 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
1bd80 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
1bd90 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1bda0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1bdb0 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
1bdc0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1bdd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bde0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
1bdf0 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
1be00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1be10 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1be20 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
1be30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1be40 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
1be50 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
1be60 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
1be70 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
1be80 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
1be90 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
1bea0 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
1beb0 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
1bec0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1bed0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
1bee0 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
1bef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
1bf00 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
1bf10 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1bf20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1bf30 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
1bf40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1bf50 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
1bf60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1bf70 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1bf80 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
1bf90 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
1bfa0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
1bfb0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
1bfc0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
1bfd0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
1bfe0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
1bff0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
1c000 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
1c010 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
1c020 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1c030 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1c040 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
1c050 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1c060 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
1c070 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
1c080 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
1c090 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
1c0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1c0b0 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
1c0c0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1c0d0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1c0e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
1c0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1c100 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
1c110 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
1c120 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
1c130 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
1c140 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
1c150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1c160 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
1c170 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c190 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
1c1a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1c1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1c1e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1c1f0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
1c200 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
1c210 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
1c220 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
1c230 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
1c240 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
1c250 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1c260 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
1c270 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1c280 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
1c290 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
1c2a0 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
1c2b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1c2c0 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
1c2d0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
1c2e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
1c2f0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
1c300 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
1c310 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
1c320 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1c330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c340 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1c350 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1c360 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
1c370 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1c380 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1c390 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1c3a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
1c3b0 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1c3d0 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
1c3e0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1c3f0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
1c400 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c410 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
1c420 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
1c430 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
1c440 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1c450 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1c460 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
1c470 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1c480 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1c490 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1c4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c4b0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1c4c0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
1c4d0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
1c4e0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c500 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
1c510 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c530 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1c540 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1c560 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1c570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c5a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1c5b0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1c5c0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
1c5d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1c5e0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
1c5f0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
1c600 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
1c610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1c630 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1c640 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
1c650 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
1c660 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
1c670 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
1c680 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
1c690 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
1c6a0 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
1c6b0 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
1c6c0 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
1c6d0 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
1c6e0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
1c6f0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
1c700 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1c710 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
1c720 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
1c730 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1c740 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49          ExprSetI
1c750 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72  rreducible(pExpr
1c760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1c770 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
1c780 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
1c790 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1c7a0 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
1c7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1c7c0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
1c7d0 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
1c7e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1c7f0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
1c800 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
1c810 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
1c820 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
1c830 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
1c840 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1c850 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1c860 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
1c870 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1c880 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ON: {.      /* T
1c890 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  he pNC->nDepth==
1c8a0 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67  0 test causes ag
1c8b0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1c8c0 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a  s in subqueries.
1c8d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
1c8e0 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
1c8f0 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
1c900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1c910 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1c920 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
1c930 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
1c940 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
1c950 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
1c960 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
1c970 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
1c980 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
1c990 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
1c9a0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1c9b0 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
1c9c0 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
1c9d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
1c9e0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1c9f0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1ca00 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1ca10 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1ca20 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
1ca30 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
1ca40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ca50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ca60 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
1ca70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
1ca80 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
1ca90 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
1caa0 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
1cab0 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
1cac0 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
1cad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1cae0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
1caf0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
1cb00 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
1cb10 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
1cb20 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
1cb30 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
1cb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cb50 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1cb60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1cb70 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1cb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
1cb90 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
1cba0 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
1cbb0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
1cbc0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
1cbd0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
1cbe0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1cbf0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
1cc00 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1cc10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1cc20 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1cc30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1cc40 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
1cc50 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1cc60 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1cc90 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1cca0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1ccb0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1ccc0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
1ccd0 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
1cce0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
1ccf0 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
1cd00 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
1cd10 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1cd20 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
1cd30 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
1cd40 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
1cd50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1cd60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cd70 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1cd80 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
1cd90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1cda0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cdb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
1cdc0 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
1cdd0 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
1cde0 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
1cdf0 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
1ce00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ce10 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ce20 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
1ce30 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
1ce40 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1ce50 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72         ExprSetIr
1ce60 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
1ce70 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1ce80 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
1ce90 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1cea0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1ceb0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
1cec0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1ced0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cee0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1cef0 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
1cf00 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
1cf10 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
1cf20 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1cf30 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1cf40 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1cf50 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
1cf60 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d  .pNC;.  if( pNC-
1cf70 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
1cf80 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
1cf90 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
1cfa0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
1cfb0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e  pSelect);.    pN
1cfc0 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20  C->nDepth--;.   
1cfd0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1cfe0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1cff0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1d000 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
1d010 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
1d020 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
1d030 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
1d040 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
1d050 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
1d060 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
1d070 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
1d080 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1d090 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
1d0a0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
1d0b0 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
1d0c0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
1d0d0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
1d0e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1d0f0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
1d100 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
1d110 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
1d120 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
1d130 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
1d140 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
1d150 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1d160 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1d170 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
1d180 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
1d190 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1d1a0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
1d1b0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
1d1c0 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
1d1d0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
1d1e0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1d1f0 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
1d200 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
1d210 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
1d220 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
1d230 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
1d240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
1d250 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1d260 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
1d270 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
1d280 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
1d290 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
1d2a0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1d2b0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
1d2c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
1d2d0 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
1d2e0 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
1d2f0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1d300 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1d310 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
1d320 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
1d330 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
1d340 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1d350 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
1d360 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
1d370 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
1d380 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1d390 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1d3a0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1d3b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1d3c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
1d3d0 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
1d3e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1d3f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1d400 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
1d410 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
1d420 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
1d430 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
1d440 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
1d450 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
1d460 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
1d470 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
1d480 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1d490 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1d4a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
1d4b0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
1d4c0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1d4d0 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
1d4e0 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
1d4f0 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
1d500 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
1d510 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
1d520 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
1d530 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
1d540 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1d550 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
1d560 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
1d570 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f  * the dallocatio
1d580 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
1d590 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
1d5a0 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
1d5b0 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
1d5c0 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
1d5d0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1d5e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1d5f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d600 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
1d610 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
1d620 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
1d630 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
1d640 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
1d650 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
1d660 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
1d670 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1d680 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1d690 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1d6a0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1d6b0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
1d6c0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
1d6d0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
1d6e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d6f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d700 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
1d710 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
1d720 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
1d730 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1d740 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
1d750 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
1d760 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
1d770 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
1d780 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
1d790 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
1d7a0 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
1d7b0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
1d7c0 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
1d7d0 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
1d7e0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
1d7f0 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21  if( nReg<=n && !
1d800 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
1d810 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e  e(pParse, i, i+n
1d820 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73  -1) ){.    pPars
1d830 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
1d840 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
1d850 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
1d860 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
1d870 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
1d880 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
1d890 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
1d8a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
1d8b0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
1d8c0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
1d8d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d8e0 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1d8f0 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  ){.  if( nReg>pP
1d900 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1d910 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
1d920 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
1d930 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
1d940 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
1d950 20 7d 0a 7d 0a                                    }.}.