/ Hex Artifact Content
Login

Artifact b2b053429575bf964c64bdf5459c5cbbe5bf93b8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0760: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0770: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0780: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0790: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
07a0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
07b0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
07c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
07d0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
07e0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
07f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0800: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0810: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0820: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0830: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0840: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0850: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0860: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0870: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
0880: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0890: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 50 61  e3ExprSetColl(Pa
08a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
08b0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
08c0: 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20 20 63  *pCollName){.  c
08d0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 20  har *zColl = 0; 
08e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
08f0: 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63  quoted name of c
0900: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0910: 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
0920: 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 33  pColl;.  sqlite3
0930: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0940: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
0950: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
0960: 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d 65 29  n(db, pCollName)
0970: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
0980: 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43   zColl ){.    pC
0990: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
09a0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
09b0: 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  e, zColl);.    i
09c0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
09d0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
09e0: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45   pColl;.      pE
09f0: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
0a00: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
0a10: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
0a20: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
0a30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  );.  return pExp
0a40: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0a50: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
0a60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0a70: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0a80: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0a90: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0aa0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
0ab0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
0ac0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
0ad0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
0ae0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0af0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
0b00: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0b10: 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45  ;.  Expr *p = pE
0b20: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  xpr;.  while( AL
0b30: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 69  WAYS(p) ){.    i
0b40: 6e 74 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c  nt op;.    pColl
0b50: 20 3d 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20   = p->pColl;.   
0b60: 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65   if( pColl ) bre
0b70: 61 6b 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e  ak;.    op = p->
0b80: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  op;.    if( p->p
0b90: 54 61 62 21 3d 30 20 26 26 20 28 0a 20 20 20 20  Tab!=0 && (.    
0ba0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43      op==TK_AGG_C
0bb0: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0bc0: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0bd0: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
0be0: 3d 54 4b 5f 54 52 49 47 47 45 52 0a 20 20 20 20  =TK_TRIGGER.    
0bf0: 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d  )){.      /* op=
0c00: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
0c10: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
0c20: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0c30: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0c40: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0c50: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0c60: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0c70: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0c80: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
0c90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0ca0: 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  ll;.      int j 
0cb0: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
0cc0: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
0cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
0ce0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0cf0: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ;.        zColl 
0d00: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
0d10: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
0d20: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
0d30: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
0d40: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
0d50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78   0);.        pEx
0d60: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pr->pColl = pCol
0d70: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
0d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0d90: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53    if( op!=TK_CAS
0da0: 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55  T && op!=TK_UPLU
0db0: 53 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  S ){.      break
0dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
0dd0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  p->pLeft;.  }.  
0de0: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
0df0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0e00: 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70  pColl) ){ .    p
0e10: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
0e20: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
0e30: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
0e40: 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  an operand of a 
0e50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0e60: 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68  tor.  aff2 is th
0e70: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
0e80: 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ty of the other 
0e90: 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
0ea0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
0eb0: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0ec0: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
0ed0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
0ee0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0ef0: 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  tor..*/.char sql
0f00: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0f10: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ity(Expr *pExpr,
0f20: 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63   char aff2){.  c
0f30: 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74  har aff1 = sqlit
0f40: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0f50: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66  Expr);.  if( aff
0f60: 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20  1 && aff2 ){.   
0f70: 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f   /* Both sides o
0f80: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0f90: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66   are columns. If
0fa0: 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63   one has numeric
0fb0: 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79  .    ** affinity
0fc0: 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65  , use that. Othe
0fd0: 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66  rwise use no aff
0fe0: 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  inity..    */.  
0ff0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e    if( sqlite3IsN
1000: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61  umericAffinity(a
1010: 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49  ff1) || sqlite3I
1020: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1030: 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20  (aff2) ){.      
1040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
1050: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
1060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1070: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1080: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  NE;.    }.  }els
1090: 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21  e if( !aff1 && !
10a0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  aff2 ){.    /* N
10b0: 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
10c0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
10d0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70   a column.  Comp
10e0: 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  are the.    ** r
10f0: 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e  esults directly.
1100: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
1110: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1120: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1130: 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20   /* One side is 
1140: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74  a column, the ot
1150: 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20  her is not. Use 
1160: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  the columns affi
1170: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  nity. */.    ass
1180: 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20  ert( aff1==0 || 
1190: 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72  aff2==0 );.    r
11a0: 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66  eturn (aff1 + af
11b0: 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  f2);.  }.}../*.*
11c0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
11d0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
11e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  .  Return the ty
11f0: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1200: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70   should.** be ap
1210: 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70  plied to both op
1220: 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20  erands prior to 
1230: 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  doing the compar
1240: 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ison..*/.static 
1250: 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41  char comparisonA
1260: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
1270: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
1280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1290: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
12a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
12b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
12c0: 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20  K_LT ||.        
12d0: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
12e0: 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GT || pExpr->op=
12f0: 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_GE || pExpr-
1300: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20  >op==TK_LE ||.  
1310: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1320: 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70  p==TK_NE || pExp
1330: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
1340: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1350: 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NOT );.  assert(
1360: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
1370: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1380: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1390: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
13a0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
13b0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
13c0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13d0: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
13e0: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  t, aff);.  }else
13f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1400: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1410: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1420: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
1430: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1440: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
1450: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1460: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73  pr, aff);.  }els
1470: 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20  e if( !aff ){.  
1480: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
1490: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72  FF_NONE;.  }.  r
14a0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
14b0: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
14c0: 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73  omparison expres
14d0: 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27  sion, eg. '=', '
14e0: 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e  <', IN(...) etc.
14f0: 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79  .** idx_affinity
1500: 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   is the affinity
1510: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
1520: 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72  olumn. Return tr
1530: 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64  ue.** if the ind
1540: 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79  ex with affinity
1550: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61   idx_affinity ma
1560: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  y be used to imp
1570: 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f  lement.** the co
1580: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70  mparison in pExp
1590: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
15a0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
15b0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
15c0: 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ar idx_affinity)
15d0: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63  {.  char aff = c
15e0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
15f0: 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74  y(pExpr);.  swit
1600: 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63  ch( aff ){.    c
1610: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1620: 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ONE:.      retur
1630: 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51  n 1;.    case SQ
1640: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
1650: 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f       return idx_
1660: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1670: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64  _AFF_TEXT;.    d
1680: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1690: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75  turn sqlite3IsNu
16a0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
16b0: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d  x_affinity);.  }
16c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16d0: 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68   the P5 value th
16e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
16f0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
1700: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
1710: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1720: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1730: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1740: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74  nd pExpr2..*/.st
1750: 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f  atic u8 binaryCo
1760: 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45  mpareP5(Expr *pE
1770: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
1780: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
1790: 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20  ll){.  u8 aff = 
17a0: 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70  (char)sqlite3Exp
17b0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
17c0: 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73  );.  aff = (u8)s
17d0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
17e0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
17f0: 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e  f) | (u8)jumpIfN
1800: 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66  ull;.  return af
1810: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  f;.}../*.** Retu
1820: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1830: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1840: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1850: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1860: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1870: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1880: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1890: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
18a0: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
18b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
18c0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18d0: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
18e0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
18f0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
1900: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1910: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
1920: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
1930: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1940: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1950: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1960: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1970: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1980: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
1990: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
19a0: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
19b0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
19c0: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
19d0: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
19e0: 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  red..*/.CollSeq 
19f0: 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f  *sqlite3BinaryCo
1a00: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
1a10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
1a20: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a    Expr *pLeft, .
1a30: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
1a40: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1a50: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ll;.  assert( pL
1a60: 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  eft );.  if( pLe
1a70: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
1a80: 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
1a90: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
1aa0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f  pColl );.    pCo
1ab0: 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ll = pLeft->pCol
1ac0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
1ad0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
1ae0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1af0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b00: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43  sert( pRight->pC
1b10: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1b20: 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c   = pRight->pColl
1b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1b50: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1b60: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
1b70: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1b80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1b90: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1ba0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
1bb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bc0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1bd0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1be0: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1bf0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
1c00: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70  tic int codeComp
1c10: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
1c20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  arse,    /* The 
1c30: 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64  parsing (and cod
1c40: 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f  e generating) co
1c50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1c60: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20  *pLeft,      /* 
1c70: 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  The left operand
1c80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
1c90: 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  ht,     /* The r
1ca0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
1cb0: 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20    int opcode,   
1cc0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
1cd0: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  rison opcode */.
1ce0: 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69    int in1, int i
1cf0: 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20  n2, /* Register 
1d00: 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73  holding operands
1d10: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
1d20: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1d30: 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a  here if true.  *
1d40: 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
1d50: 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65  ll    /* If true
1d60: 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72  , jump if either
1d70: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
1d80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b   */.){.  int p5;
1d90: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43  .  int addr;.  C
1da0: 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70  ollSeq *p4;..  p
1db0: 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  4 = sqlite3Binar
1dc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1dd0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1de0: 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62  Right);.  p5 = b
1df0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70  inaryCompareP5(p
1e00: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75  Left, pRight, ju
1e10: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  mpIfNull);.  add
1e20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1e30: 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56  ddOp4(pParse->pV
1e40: 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32  dbe, opcode, in2
1e50: 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20  , dest, in1,.   
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1e80: 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  4, P4_COLLSEQ);.
1e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1ea0: 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56  ngeP5(pParse->pV
1eb0: 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20  dbe, (u8)p5);.  
1ec0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1ed0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
1ee0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
1ef0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
1f00: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
1f10: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1f20: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
1f30: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
1f40: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
1f50: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
1f60: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
1f70: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
1f80: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1f90: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
1fa0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fb0: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
1fc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fd0: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
1fe0: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
1ff0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
2000: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
2010: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
2020: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
2030: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2040: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2050: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
2060: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
2070: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
2080: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
2090: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
20a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
20b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
20d0: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
20e0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
20f0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2100: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
2110: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
2120: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
2130: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
2140: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
2150: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
2160: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
2170: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2180: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
2190: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
21a0: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
21b0: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
21c0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
21d0: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
21e0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
21f0: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
2200: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
2210: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
2220: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
2230: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2240: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
2250: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
2260: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2270: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
2280: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
2290: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
22a0: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
22b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
22c0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
22d0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
22e0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
22f0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2300: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2310: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
2320: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2330: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2340: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
2350: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
2360: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2370: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
2380: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  lect *p, int *pn
2390: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
23a0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
23b0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
23c0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
23d0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
23e0: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
23f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2400: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
2410: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2420: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f  ightOfExpr(p->pO
2430: 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29  ffset, pnHeight)
2440: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2450: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
2460: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2470: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2480: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
2490: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
24a0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
24b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
24c0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24d0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72  tOfSelect(p->pPr
24e0: 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ior, pnHeight);.
24f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
2500: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2510: 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  t variable in th
2520: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
2530: 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67  ed as an .** arg
2540: 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73  ument. An expres
2550: 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69  sion with no chi
2560: 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73  ldren, Expr.pLis
2570: 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53  t or .** Expr.pS
2580: 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73  elect member has
2590: 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20   a height of 1. 
25a0: 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
25b0: 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65  sion.** has a he
25c0: 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68  ight equal to th
25d0: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
25e0: 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a   of any other .*
25f0: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70  * referenced Exp
2600: 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73  r plus one..*/.s
2610: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53  tatic void exprS
2620: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
2630: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2640: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2650: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
2660: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
2670: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67  htOfExpr(p->pRig
2680: 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ht, &nHeight);. 
2690: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
26a0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
26b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69  lect) ){.    hei
26c0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78  ghtOfSelect(p->x
26d0: 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  .pSelect, &nHeig
26e0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
26f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
2700: 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  st(p->x.pList, &
2710: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
2720: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
2730: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
2740: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2750: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2760: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
2770: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
2780: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
2790: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
27a0: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
27b0: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
27c0: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
27d0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
27e0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
27f0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
2800: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
2810: 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  rse, Expr *p){. 
2820: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
2830: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2840: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
2850: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
2860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2870: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2880: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
2890: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
28a0: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
28b0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
28c0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
28d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
28e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
28f0: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
2900: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2910: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2920: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
2930: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
2940: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20  eight;.}.#else. 
2950: 20 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74   #define exprSet
2960: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
2970: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
2980: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
2990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
29a0: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
29b0: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
29c0: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
29d0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
29e0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
29f0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
2a00: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
2a10: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
2a20: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
2a30: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
2a40: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
2a50: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
2a60: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
2a70: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
2a80: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2a90: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2aa0: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2ab0: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
2ac0: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
2ad0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
2ae0: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
2af0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
2b00: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
2b10: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
2b20: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
2b30: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
2b40: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68  performance.  Th
2b50: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
2b60: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
2b70: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
2b80: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
2b90: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
2ba0: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
2bb0: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
2bc0: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
2bd0: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
2be0: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
2bf0: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
2c00: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
2c10: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
2c20: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
2c30: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
2c40: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
2c50: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
2c60: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
2c70: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
2c80: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
2c90: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
2ca0: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
2cb0: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
2cc0: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
2cd0: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
2ce0: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
2cf0: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
2d00: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
2d10: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
2d20: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
2d30: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
2d40: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
2d50: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
2d60: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
2d70: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
2d80: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2d90: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
2da0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
2db0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
2dc0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
2dd0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
2de0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
2df0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2e00: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
2e10: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
2e20: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
2e30: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
2e40: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
2e50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
2e60: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
2e70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2e80: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
2e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
2ea0: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
2eb0: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
2ec0: 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ..  if( pToken )
2ed0: 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b  {.    if( op!=TK
2ee0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b  _INTEGER || pTok
2ef0: 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  en->z==0.       
2f00: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
2f10: 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c  Int32(pToken->z,
2f20: 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a   &iValue)==0 ){.
2f30: 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70        nExtra = p
2f40: 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20  Token->n+1;.    
2f50: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  }.  }.  pNew = s
2f60: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2f70: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
2f80: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
2f90: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
2fa0: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
2fb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
2fc0: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
2fd0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
2fe0: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
2ff0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
3000: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
3010: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
3020: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
3030: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
3040: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
3050: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
3060: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
3070: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
3080: 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
3090: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
30a0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
30b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
30c0: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
30d0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
30e0: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 6e  if( dequote && n
30f0: 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20 20  Extra>=3 .      
3100: 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d 20         && ((c = 
3110: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27  pToken->z[0])=='
3120: 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c  \'' || c=='"' ||
3130: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60   c=='[' || c=='`
3140: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
3150: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
3160: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
3170: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
3180: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
3190: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
31a0: 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
31b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
31c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
31d0: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
31e0: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
31f0: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
3200: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3210: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
3220: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
3230: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
3240: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
3250: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
3260: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
3270: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3280: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
3290: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
32a0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
32b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
32c0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
32d0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
32e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3300: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
3310: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
3320: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
3330: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
3340: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
3350: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
3360: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
3370: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
3380: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
3390: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
33a0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
33b0: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
33c0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
33d0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
33e0: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
33f0: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
3400: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
3410: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
3420: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
3430: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
3440: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
3450: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
3460: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
3470: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
3480: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
3490: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
34a0: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
34b0: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
34c0: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
34d0: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
34e0: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
34f0: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
3500: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
3510: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
3520: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3530: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
3540: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3550: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
3560: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
3570: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
3580: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
3590: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
35a0: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
35b0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
35c0: 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  {.        pRoot-
35d0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
35e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
35f0: 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20   pRoot->pColl = 
3600: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
3610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3620: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
3630: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
3640: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
3650: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
3660: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   ){.        pRoo
3680: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  t->flags |= EP_E
3690: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
36a0: 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20     pRoot->pColl 
36b0: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
36c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36d0: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
36e0: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
36f0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3700: 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20  Expr node which 
3710: 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73  joins as many as
3720: 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a   two subtrees..*
3730: 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68  *.** One or both
3740: 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73   of the subtrees
3750: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52   can be NULL.  R
3760: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3770: 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78  to the new.** Ex
3780: 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66  pr node.  Or, if
3790: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
37a0: 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65  curs, set pParse
37b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
37c0: 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20  ed,.** free the 
37d0: 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74  subtrees and ret
37e0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70  urn NULL..*/.Exp
37f0: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
3800: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3810: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
3820: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3830: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3850: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
3860: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
3870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3880: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
3890: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
38a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
38b0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
38c0: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
38d0: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
38e0: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
38f0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
3900: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
3910: 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f  rse->db, op, pTo
3920: 6b 65 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ken, 1);.  sqlit
3930: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
3940: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
3950: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
3960: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  t);.  return p;.
3970: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
3980: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
3990: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
39a0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
39b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
39c0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
39d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
39e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
39f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3a00: 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  prAnd(sqlite3 *d
3a10: 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  b, Expr *pLeft, 
3a20: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
3a30: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b   if( pLeft==0 ){
3a40: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67  .    return pRig
3a50: 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ht;.  }else if( 
3a60: 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  pRight==0 ){.   
3a70: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20   return pLeft;. 
3a80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
3a90: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
3aa0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
3ab0: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
3ac0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
3ad0: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
3ae0: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
3af0: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
3b00: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
3b10: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
3b20: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
3b30: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
3b40: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
3b50: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
3b60: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3b70: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
3b80: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
3b90: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
3ba0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
3bb0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
3bc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
3bd0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
3be0: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
3bf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
3c00: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
3c10: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
3c20: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
3c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3c40: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
3c50: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
3c60: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
3c70: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
3c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3c90: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
3ca0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
3cb0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
3cc0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
3cd0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
3ce0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
3cf0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
3d00: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
3d10: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
3d20: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
3d30: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
3d40: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
3d50: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
3d60: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
3d70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
3d80: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
3d90: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
3da0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
3db0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
3dc0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
3dd0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3de0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
3df0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
3e00: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
3e10: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
3e20: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
3e30: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
3e40: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
3e50: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
3e60: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
3e70: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
3e80: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
3e90: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
3ea0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
3eb0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3ec0: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
3ed0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
3ee0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
3ef0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
3f00: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
3f10: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
3f20: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
3f30: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
3f40: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
3f50: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
3f60: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
3f70: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
3f80: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
3f90: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3fa0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
3fb0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
3fc0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
3fd0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
3fe0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
3ff0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4000: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4010: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4020: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
4030: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4040: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
4050: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
4060: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
4070: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
4080: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
4090: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
40a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
40b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
40c0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
40d0: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
40e0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
40f0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4100: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4110: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4120: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
4130: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
4140: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
4150: 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  [0]=='?' ){.    
4160: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
4170: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
4180: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
4190: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
41a0: 0a 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61  .    ** use it a
41b0: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
41c0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  umber */.    int
41d0: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
41e0: 29 26 7a 5b 31 5d 29 3b 0a 20 20 20 20 70 45 78  )&z[1]);.    pEx
41f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
4200: 6e 56 61 72 29 69 3b 0a 20 20 20 20 74 65 73 74  nVar)i;.    test
4210: 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20  case( i==0 );.  
4220: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
4230: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
4240: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
4250: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4260: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
4270: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4280: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
4290: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
42a0: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
42b0: 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69      if( i<1 || i
42c0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
42d0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
42e0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
42f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4300: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
4310: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
4320: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
4330: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
4340: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
4350: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4360: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
4370: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
4380: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
4390: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
43a0: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
43b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
43c0: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
43d0: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
43e0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
43f0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
4400: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
4410: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
4420: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4430: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
4440: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
4450: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
4460: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
4470: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
4480: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
4490: 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33 32 20   int i;.    u32 
44a0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
44b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
44c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
44d0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20  arse->nVarExpr; 
44e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
44f0: 20 2a 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61   *pE = pParse->a
4500: 70 56 61 72 45 78 70 72 5b 69 5d 3b 0a 20 20 20  pVarExpr[i];.   
4510: 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
4520: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65   );.      if( me
4530: 6d 63 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b 65  mcmp(pE->u.zToke
4540: 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 70  n, z, n)==0 && p
4550: 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d 3d  E->u.zToken[n]==
4560: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
4570: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  pr->iColumn = pE
4580: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4590: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
45a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
45b0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
45c0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
45d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
45e0: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
45f0: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 69 66 28  nVar);.      if(
4600: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
4610: 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  r>=pParse->nVarE
4620: 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20  xprAlloc-1 ){.  
4630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4640: 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70  arExprAlloc += p
4650: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
4660: 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20  lloc + 10;.     
4670: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
4680: 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
4690: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
46a0: 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20  locOrFree(.     
46b0: 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20           db,.   
46c0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
46d0: 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20  e->apVarExpr,.  
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
46f0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
4700: 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  c*sizeof(pParse-
4710: 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20  >apVarExpr[0]). 
4720: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
4730: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4740: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
4750: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
4760: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56  ert( pParse->apV
4770: 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  arExpr!=0 );.   
4780: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4790: 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e  arExpr[pParse->n
47a0: 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78  VarExpr++] = pEx
47b0: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
47c0: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
47d0: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
47e0: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
47f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4800: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4810: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
4820: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4830: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
4840: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
4850: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
4860: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
4870: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
4880: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4890: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
48a0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
48b0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
48c0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 45  return;.  if( !E
48d0: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
48e0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
48f0: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
4900: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4910: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
4920: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4930: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
4940: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
4950: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
4960: 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e  Reduced) && (p->
4970: 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c  flags2 & EP2_Mal
4980: 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29  locedToken)!=0 )
4990: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
49a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
49b0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
49c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
49d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
49e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
49f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
4a00: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
4a10: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
4a20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4a30: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4a40: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
4a50: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
4a60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4a70: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
4a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4a90: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4ab0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4ac0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
4ad0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4ae0: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
4af0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
4b00: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
4b10: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
4b20: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
4b30: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
4b40: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
4b50: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
4b60: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
4b70: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
4b80: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
4b90: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
4ba0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
4bb0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
4bc0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
4bd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4be0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
4bf0: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
4c00: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
4c10: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
4c30: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
4c40: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
4c50: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4c60: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
4c70: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
4c80: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
4c90: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
4ca0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
4cb0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
4cc0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
4cd0: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
4ce0: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
4cf0: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
4d00: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
4d10: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
4d20: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
4d30: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
4d40: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
4d50: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
4d60: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
4d70: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
4d80: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
4d90: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
4da0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
4db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4df0: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
4e00: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
4e10: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
4e20: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
4e30: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
4e40: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
4e50: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
4e60: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
4e70: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
4e80: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
4e90: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
4ea0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
4eb0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
4ec0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
4ed0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
4ee0: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
4ef0: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
4f00: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
4f10: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
4f20: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
4f30: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
4f40: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
4f50: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
4f60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
4f70: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
4f80: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
4f90: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
4fa0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
4fb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
4fc0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
4fd0: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
4fe0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
4ff0: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
5000: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
5010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
5020: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
5030: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
5040: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
5050: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
5060: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
5070: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
5080: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
5090: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
50a0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
50b0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
50c0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
50d0: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
50e0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
50f0: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
5100: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
5110: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
5120: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
5130: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5140: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
5150: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
5160: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
5170: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
5180: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
5190: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
51a0: 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52 45  ake a EXPRDUP_RE
51b0: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
51c0: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
51d0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
51e0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
51f0: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
5200: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
5210: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
5220: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
5230: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
5240: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
5250: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
5260: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
5270: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
5280: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
5290: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
52a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
52b0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
52c0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
52d0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
52e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
52f0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
5300: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
5310: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
5320: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
5330: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c   */.  if( 0==(fl
5340: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5350: 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  CE) ){.    nSize
5360: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
5370: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
5380: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
5390: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
53a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
53b0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
53c0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
53d0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
53e0: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
53f0: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
5400: 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64  2 & EP2_Malloced
5410: 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20  Token)==0 );.   
5420: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
5430: 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64 75  gs2 & EP2_Irredu
5440: 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20  cible)==0 );.   
5450: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
5460: 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d   p->pRight || p-
5470: 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70  >pColl || p->x.p
5480: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
5490: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
54a0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
54b0: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
54c0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
54d0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
54e0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
54f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5500: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
5510: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5520: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
5530: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
5540: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
5550: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
5560: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5570: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
5580: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
5590: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
55a0: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
55b0: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
55c0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
55d0: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
55e0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
55f0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
5600: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5610: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
5620: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
5630: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5640: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
5650: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
5660: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
5670: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
5680: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
5690: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
56a0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
56b0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
56c0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
56d0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
56e0: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
56f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
5700: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5710: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
5720: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5730: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
5740: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
5750: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
5760: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5770: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
5780: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
5790: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
57a0: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
57b0: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
57c0: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
57d0: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
57e0: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
57f0: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
5800: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
5810: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
5820: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
5830: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
5840: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
5850: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
5860: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
5870: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
5880: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
5890: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
58a0: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
58b0: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
58c0: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
58d0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
58e0: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
58f0: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
5900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
5910: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
5920: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
5930: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
5940: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5950: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
5960: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
5970: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
5980: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5990: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
59a0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
59b0: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
59c0: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
59d0: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
59e0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
59f0: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
5a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5a10: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
5a20: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
5a30: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
5a40: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
5a50: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
5a60: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
5a70: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
5a80: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
5a90: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
5aa0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5ab0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
5ac0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
5ad0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
5ae0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
5af0: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
5b00: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
5b10: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
5b20: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
5b30: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
5b40: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
5b50: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
5b60: 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64  irst byte passed
5b70: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
5b80: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
5b90: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
5ba0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
5bb0: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
5bc0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5bd0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
5be0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
5bf0: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
5c00: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
5c20: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
5c30: 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  /.  if( p ){.   
5c40: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64   const int isRed
5c50: 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58  uced = (flags&EX
5c60: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
5c70: 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20     u8 *zAlloc;. 
5c80: 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61     u32 staticFla
5c90: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  g = 0;..    asse
5ca0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
5cb0: 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a  || isReduced );.
5cc0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
5cd0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
5ce0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
5cf0: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
5d00: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
5d10: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
5d20: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20  *pzBuffer;.     
5d30: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
5d40: 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c  _Static;.    }el
5d50: 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63  se{.      zAlloc
5d60: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5d70: 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45  ocRaw(db, dupedE
5d80: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
5d90: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
5da0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
5db0: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
5dc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
5dd0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
5de0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
5df0: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
5e00: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
5e10: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
5e20: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
5e30: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
5e40: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5e50: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
5e60: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
5e70: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
5e80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5e90: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
5ea0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
5eb0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
5ec0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
5ed0: 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
5ee0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
5ef0: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
5f00: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
5f10: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
5f20: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
5f30: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
5f40: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
5f50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ;.      int nTok
5f60: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  en;.      if( !E
5f70: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5f80: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
5f90: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
5fa0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
5fb0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5fc0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
5fd0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
5fe0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
5ff0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6000: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
6010: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6020: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
6030: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
6040: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
6050: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
6060: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
6070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6080: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65     int nSize = e
6090: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
60a0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
60b0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
60c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
60d0: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
60e0: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
60f0: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
6100: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
6110: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
6120: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
6130: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
6140: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
6150: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  y. */.      pNew
6160: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
6170: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6180: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b  Only|EP_Static);
6190: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
61a0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
61b0: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
61c0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
61d0: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
61e0: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
61f0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
6200: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6210: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
6220: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  /.      if( nTok
6230: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  en ){.        ch
6240: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
6250: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6260: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
6270: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  wSize];.        
6280: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
6290: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
62a0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  en);.      }..  
62b0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
62c0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
62d0: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
62e0: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  y) ){.        /*
62f0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
6300: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
6310: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
6320: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mber. */.       
6330: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6340: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
6350: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
6360: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
6370: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
6380: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
6390: 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65  Select, isReduce
63a0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
63b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
63c0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
63d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
63e0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
63f0: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6400: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6410: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6420: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
6430: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
6440: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
6450: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e  asAnyProperty(pN
6460: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
6470: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6480: 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b          zAlloc +
6490: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
64a0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
64b0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
64c0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
64d0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
64e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
64f0: 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28  pLeft = exprDup(
6500: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
6510: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6520: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6530: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
6540: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6550: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
6560: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
6570: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6580: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
65a0: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
65b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
65c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
65d0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20   pNew->flags2 = 
65e0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  0;.        if( !
65f0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6600: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
6610: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
6620: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
6630: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6640: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
6650: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6660: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
6670: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6680: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
6690: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
66a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
66b0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
66c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
66d0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
66e0: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
66f0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
6700: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
6710: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
6720: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
6730: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
6740: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
6750: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
6760: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
6770: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
6780: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
6790: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
67a0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
67b0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
67c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
67d0: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
67e0: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
67f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6800: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
6810: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
6820: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
6830: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
6840: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
6850: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
6860: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6870: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
6880: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
6890: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
68a0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
68b0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
68c0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
68d0: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
68e0: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
68f0: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
6900: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
6910: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
6920: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6930: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6940: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
6950: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
6960: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
6970: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
6980: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6990: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
69a0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
69b0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
69c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
69d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
69e0: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
69f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
6a00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6a10: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6a20: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75  .  return exprDu
6a30: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
6a40: 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a  0);.}.ExprList *
6a50: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6a60: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
6a70: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
6a80: 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c   flags){.  ExprL
6a90: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
6aa0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6ab0: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
6ac0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
6ad0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
6ae0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
6af0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6b00: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
6b10: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
6b20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6b30: 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72    pNew->iECursor
6b40: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45   = 0;.  pNew->nE
6b50: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
6b60: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
6b70: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
6b80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6b90: 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45  ocRaw(db,  p->nE
6ba0: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
6bb0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
6bc0: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
6bd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6be0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
6bf0: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
6c00: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
6c10: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
6c20: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
6c30: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
6c40: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
6c50: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
6c60: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
6c70: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
6c80: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
6c90: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
6ca0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
6cb0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
6cc0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
6cd0: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
6ce0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
6cf0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
6d00: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
6d10: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
6d20: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
6d30: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
6d40: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
6d50: 20 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d     pItem->iCol =
6d60: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b   pOldItem->iCol;
6d70: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69  .    pItem->iAli
6d80: 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  as = pOldItem->i
6d90: 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74  Alias;.  }.  ret
6da0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
6db0: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
6dc0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
6dd0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
6de0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
6df0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
6e00: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
6e10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
6e20: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
6e30: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
6e40: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
6e50: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
6e60: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
6e70: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
6e80: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
6e90: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
6ea0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6eb0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
6ec0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ed0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
6ee0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6ef0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
6f00: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
6f10: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
6f20: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
6f30: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6f40: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
6f50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
6f60: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
6f70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6f80: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
6f90: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
6fa0: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
6fb0: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
6fc0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
6fd0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6fe0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
6ff0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7000: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7010: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
7020: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
7030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7040: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
7050: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7060: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
7070: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
7080: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7090: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
70a0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
70b0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
70c0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
70d0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
70e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
70f0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7100: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7110: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7120: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7130: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7140: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7150: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7160: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7170: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7180: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7190: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
71a0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
71b0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
71c0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
71d0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
71e0: 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f  isPopulated = pO
71f0: 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ldItem->isPopula
7200: 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ted;.    pNewIte
7210: 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
7220: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7230: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pOldItem->zIndex
7240: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7250: 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f  >notIndexed = pO
7260: 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ldItem->notIndex
7270: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
7280: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  ->pIndex = pOldI
7290: 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  tem->pIndex;.   
72a0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
72b0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
72c0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
72d0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
72e0: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
72f0: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
7300: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7310: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
7320: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
7330: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
7340: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
7350: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7360: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
7370: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
7380: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
7390: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
73a0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
73b0: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
73c0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
73d0: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
73e0: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
73f0: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
7400: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7410: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
7420: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
7430: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7440: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7450: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7460: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7470: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7480: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7490: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
74a0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
74b0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
74c0: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
74d0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
74e0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
74f0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
7500: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
7510: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
7520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7530: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
7540: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
7550: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
7560: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7570: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
7580: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
7590: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
75a0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
75b0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
75c0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
75d0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
75e0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
75f0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
7600: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
7610: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
7620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7630: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
7640: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
7650: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
7660: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
7670: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
7680: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
7690: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
76a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
76b0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
76c0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
76d0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
76e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
76f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7700: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
7710: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ist, flags);.  p
7720: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
7730: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
7740: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
7750: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
7760: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
7770: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
7780: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7790: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
77a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
77b0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
77c0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
77d0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
77e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
77f0: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
7800: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
7810: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7820: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7830: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
7840: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
7850: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
7860: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
7870: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
7880: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
7890: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
78a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
78b0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
78c0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
78d0: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
78e0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
78f0: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
7900: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
7910: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
7920: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
7930: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
7940: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
7950: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
7960: 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
7970: 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  0;.  pNew->addrO
7980: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
7990: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
79a0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
79b0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
79c0: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72  phm[2] = -1;.  r
79d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
79e0: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
79f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7a00: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7a10: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7a20: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7a30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
7a40: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7a50: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
7a60: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
7a70: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
7a80: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
7a90: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
7aa0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
7ab0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
7ac0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
7ad0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
7ae0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
7af0: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
7b00: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
7b10: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
7b20: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
7b30: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
7b40: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
7b50: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
7b60: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
7b70: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
7b80: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
7b90: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
7ba0: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
7bb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7bc0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7bd0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7be0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
7bf0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
7c00: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
7c10: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
7c20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
7c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
7c40: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
7c50: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
7c60: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
7c70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7c80: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
7c90: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
7ca0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
7cb0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
7cc0: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
7cd0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
7ce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
7cf0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
7d00: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
7d10: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  ->nAlloc==0 );. 
7d20: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
7d30: 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e  nAlloc<=pList->n
7d40: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75  Expr ){.    stru
7d50: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
7d60: 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d   *a;.    int n =
7d70: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
7d80: 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 4;.    a = sq
7d90: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
7da0: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  b, pList->a, n*s
7db0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
7dc0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
7dd0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
7de0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
7df0: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
7e00: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
7e10: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
7e20: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f 73  locSize(db, a)/s
7e30: 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d  izeof(a[0]);.  }
7e40: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
7e50: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
7e60: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
7e70: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
7e80: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
7e90: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
7ea0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
7eb0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
7ec0: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
7ed0: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
7ee0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7ef0: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
7f00: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
7f10: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
7f20: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
7f30: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
7f40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7f50: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
7f60: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
7f70: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
7f80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7f90: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
7fa0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
7fb0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
7fc0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
7fd0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
7fe0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
7ff0: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
8000: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
8010: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
8020: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
8030: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
8040: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
8050: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
8060: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
8070: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8080: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
8090: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
80a0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
80b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
80c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
80d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
80e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
80f0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
8100: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
8110: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
8120: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
8130: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
8140: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
8150: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
8160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
8170: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
8180: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
8190: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
81a0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
81b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
81c0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
81d0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
81e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
81f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8200: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8210: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
8220: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
8230: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
8240: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
8250: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
8260: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
8270: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8280: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
8290: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
82a0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
82b0: 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d  equote && pItem-
82c0: 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33  >zName ) sqlite3
82d0: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
82e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
82f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
8300: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
8310: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
8320: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
8330: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
8340: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8350: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
8360: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
8370: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
8380: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
8390: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
83a0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
83b0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
83c0: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
83d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
83e0: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
83f0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
8400: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
8410: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
8420: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8430: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8440: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8450: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
8460: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
8470: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
8480: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
8490: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
84a0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
84b0: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
84c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
84d0: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
84e0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
84f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
8500: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
8510: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
8520: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8530: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
8540: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
8550: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
8560: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
8570: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
8580: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
8590: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
85a0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
85b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
85c0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
85d0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
85e0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
85f0: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
8600: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8630: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
8640: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
8650: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
8660: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
8670: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
8680: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
8690: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
86a0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
86b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
86c0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
86d0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
86e0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
86f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8700: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8710: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
8720: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
8730: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
8740: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8750: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
8760: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
8770: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
8780: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
8790: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
87a0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
87b0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
87c0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
87d0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
87e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
87f0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8800: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
8810: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
8820: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
8830: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
8840: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
8850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8860: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
8870: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
8880: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
8890: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
88a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
88b0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
88c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
88d0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
88e0: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
88f0: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
8900: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
8910: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
8920: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
8930: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
8940: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
8950: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
8960: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8970: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8980: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
8990: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
89a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
89b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
89c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
89d0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
89e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
89f0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
8a00: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
8a10: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
8a20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
8a30: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
8a40: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20  lker callbacks. 
8a50: 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20   Walker.u.pi is 
8a60: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8a70: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
8a80: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
8a90: 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72  checking an expr
8aa0: 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a  ession to see.**
8ab0: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73   if it is a cons
8ac0: 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b  tant.  Set *Walk
8ad0: 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20  er.u.pi to 0 if 
8ae0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
8af0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  s.** not constan
8b00: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  t..**.** These c
8b10: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
8b20: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
8b30: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
8b40: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
8b50: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
8b60: 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73  stant().**     s
8b70: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
8b80: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a  tantNotJoin().**
8b90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8ba0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
8bb0: 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61  tion().**.*/.sta
8bc0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
8bd0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
8be0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
8bf0: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
8c00: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  If pWalker->u.i 
8c10: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
8c20: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
8c30: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
8c40: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
8c50: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
8c60: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
8c70: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
8c80: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
8c90: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
8ca0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
8cb0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
8cc0: 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73  .i==3 && ExprHas
8cd0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
8ce0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
8cf0: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
8d00: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  u.i = 0;.    ret
8d10: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
8d20: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
8d30: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
8d40: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
8d50: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
8d60: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
8d70: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
8d80: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
8d90: 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  nd pWalker->u.i=
8da0: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
8db0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
8dc0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
8dd0: 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30  .i==2 ) return 0
8de0: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
8df0: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
8e00: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
8e10: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
8e20: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
8e30: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
8e40: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
8e50: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8e60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
8e70: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
8e80: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
8e90: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
8ea0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8eb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
8ec0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
8ed0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
8ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
8ef0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61  UMN );.      pWa
8f00: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
8f10: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
8f20: 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75  Abort;.    defau
8f30: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
8f40: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8f50: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
8f60: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
8f70: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
8f80: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
8f90: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
8fa0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
8fb0: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
8fc0: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
8fd0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
8fe0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
8ff0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
9000: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
9010: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9020: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9030: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
9040: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
9050: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
9060: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
9070: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
9080: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
9090: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
90a0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
90b0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
90c0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
90d0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
90e0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
90f0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
9100: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
9110: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9120: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9130: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9140: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9150: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9160: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9170: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9180: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9190: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
91a0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
91b0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
91c0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
91d0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
91e0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
91f0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9200: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9210: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9220: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9230: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9240: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9250: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9260: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9270: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9280: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
9290: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
92a0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
92b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
92c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
92d0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
92e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
92f0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9300: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9310: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9320: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9330: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9340: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9350: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9360: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9370: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
9380: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
9390: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
93a0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
93b0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
93c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
93d0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
93e0: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
93f0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9400: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9410: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9420: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9430: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9440: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9450: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9460: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
9470: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
9480: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
9490: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
94a0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
94b0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
94c0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
94d0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
94e0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
94f0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9500: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9510: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9520: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9530: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9540: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9550: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9560: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9570: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9580: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9590: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
95a0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
95b0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
95c0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
95d0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
95e0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
95f0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9600: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9610: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9620: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9630: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9640: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9650: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9660: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9670: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9680: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
9690: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
96a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
96b0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
96c0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
96d0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
96e0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  0;.  if( p->flag
96f0: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
9700: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
9710: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
9720: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9730: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
9740: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9750: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
9760: 72 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49  rc = sqlite3GetI
9770: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
9780: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
9790: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
97a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
97b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
97c0: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
97d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
97e0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
97f0: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
9800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9810: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
9820: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
9830: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
9840: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9850: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
9860: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
9870: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
9880: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
9890: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
98a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
98b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
98c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65  ( rc ){.    asse
98d0: 72 74 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  rt( ExprHasAnyPr
98e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
98f0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9900: 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y).             
9910: 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 32 20    || (p->flags2 
9920: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
9930: 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ken)==0 );.    p
9940: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  ->op = TK_INTEGE
9950: 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  R;.    p->flags 
9960: 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
9970: 20 20 20 20 70 2d 3e 75 2e 69 56 61 6c 75 65 20      p->u.iValue 
9980: 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20  = *pValue;.  }. 
9990: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
99a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  *.** Return FALS
99b0: 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  E if there is no
99c0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
99d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
99e0: 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  be NULL..**.** I
99f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9a00: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f   might be NULL o
9a10: 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
9a20: 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c  ion is too compl
9a30: 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65  ex.** to tell re
9a40: 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a  turn TRUE.  .**.
9a50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9a60: 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70  is used as an op
9a70: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73  timization, to s
9a80: 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  kip OP_IsNull op
9a90: 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65  codes.** when we
9aa0: 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c   know that a val
9ab0: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  ue cannot be NUL
9ac0: 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c  L.  Hence, a fal
9ad0: 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28  se positive.** (
9ae0: 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77  returning TRUE w
9af0: 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20  hen in fact the 
9b00: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e  expression can n
9b10: 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69  ever be NULL) mi
9b20: 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c  ght.** be a smal
9b30: 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  l performance hi
9b40: 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  t but is otherwi
9b50: 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e  se harmless.  On
9b60: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61   the other.** ha
9b70: 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61  nd, a false nega
9b80: 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20  tive (returning 
9b90: 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72  FALSE when the r
9ba0: 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e  esult could be N
9bb0: 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b  ULL).** will lik
9bc0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ely result in an
9bd0: 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
9be0: 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64  r.  So when in d
9bf0: 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  oubt, return.** 
9c00: 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TRUE..*/.int sql
9c10: 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
9c20: 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29  l(const Expr *p)
9c30: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69  {.  u8 op;.  whi
9c40: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
9c50: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
9c60: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
9c70: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
9c80: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
9c90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
9ca0: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
9cb0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
9cc0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
9cd0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
9ce0: 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20  TRING:.    case 
9cf0: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
9d00: 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20  se TK_BLOB:.    
9d10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
9d20: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
9d30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
9d40: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
9d50: 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74  n OP_IsNull inst
9d60: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 74 65 73  ruction that tes
9d70: 74 73 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ts register iReg
9d80: 20 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f   and jumps.** to
9d90: 20 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73 74 20   location iDest 
9da0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
9db0: 69 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54  iReg is NULL.  T
9dc0: 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67  he value in iReg
9dd0: 20 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75 74 65   .** was compute
9de0: 64 20 62 79 20 70 45 78 70 72 2e 20 20 49 66 20  d by pExpr.  If 
9df0: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70  we can look at p
9e00: 45 78 70 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d  Expr at compile-
9e10: 74 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65  time and.** dete
9e20: 72 6d 69 6e 65 20 74 68 61 74 20 69 74 20 63 61  rmine that it ca
9e30: 6e 20 6e 65 76 65 72 20 67 65 6e 65 72 61 74 65  n never generate
9e40: 20 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68   a NULL, then th
9e50: 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72  e OP_IsNull oper
9e60: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
9e70: 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  omitted..*/.void
9e80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9e90: 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64  IsNullJump(.  Vd
9ea0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
9eb0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
9ec0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9ed0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78 70 72   */.  const Expr
9ee0: 20 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c   *pExpr,  /* Onl
9ef0: 79 20 67 65 6e 65 72 61 74 65 20 4f 50 5f 49 73  y generate OP_Is
9f00: 4e 75 6c 6c 20 69 66 20 74 68 69 73 20 65 78 70  Null if this exp
9f10: 72 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f  r can be NULL */
9f20: 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
9f30: 20 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74         /* Test t
9f40: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
9f50: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 4e 55   register for NU
9f60: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73  LL */.  int iDes
9f70: 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  t           /* J
9f80: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
9f90: 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f  value is null */
9fa0: 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .){.  if( sqlite
9fb0: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
9fc0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
9fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9fe0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
9ff0: 67 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d  g, iDest);.  }.}
a000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
a010: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
a020: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a030: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
a040: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
a050: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
a060: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
a070: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
a080: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
a090: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
a0a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a0b0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a0c0: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
a0d0: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
a0e0: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
a0f0: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
a100: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
a110: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
a120: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
a130: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
a140: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
a150: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
a160: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
a170: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a180: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
a190: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
a1a0: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
a1b0: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
a1c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a1d0: 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ONE ) return 1;.
a1e0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
a1f0: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
a200: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
a210: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
a220: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
a230: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
a240: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
a250: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
a260: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
a270: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
a280: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
a290: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
a2a0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
a2b0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
a2c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
a2d0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
a2e0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
a2f0: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
a300: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a310: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
a320: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
a330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
a340: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
a350: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
a360: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
a370: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a380: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
a390: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
a3a0: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
a3b0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
a3c0: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
a3d0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
a3e0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
a3f0: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
a400: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
a410: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
a420: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
a430: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
a440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
a450: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
a460: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
a470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a480: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
a490: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
a4a0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
a4b0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
a4c0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
a4d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
a4e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
a4f0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
a500: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
a510: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a520: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
a530: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
a540: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a550: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
a560: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
a570: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
a580: 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
a590: 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20  are able to the 
a5a0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69  IN operator opti
a5b0: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a  mization on a.**
a5c0: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
a5d0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78  rm.**.**       x
a5e0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
a5f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65  .**.** Where the
a600: 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73   SELECT... claus
a610: 65 20 69 73 20 61 73 20 73 70 65 63 69 66 69 65  e is as specifie
a620: 64 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74  d by the paramet
a630: 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f  er to this.** ro
a640: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
a650: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70   Select object p
a660: 61 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72  assed in has alr
a670: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f  eady been prepro
a680: 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a  cessed and no.**
a690: 20 65 72 72 6f 72 73 20 68 61 76 65 20 62 65 65   errors have bee
a6a0: 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e  n found..*/.#ifn
a6b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a6c0: 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
a6d0: 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46  int isCandidateF
a6e0: 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a  orInOpt(Select *
a6f0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
a700: 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
a710: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
a720: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
a730: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73   /* right-hand s
a760: 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c  ide of IN is SEL
a770: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
a780: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
a790: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a7a0: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
a7b0: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
a7c0: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
a7d0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
a7e0: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
a7f0: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
a800: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
a810: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
a820: 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
a830: 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
a840: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
a850: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
a860: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
a870: 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
a880: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
a890: 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
a8a0: 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
a8b0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
a8c0: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
a8d0: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
a8e0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
a8f0: 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
a900: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a910: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
a920: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
a930: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
a940: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
a950: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
a960: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
a970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
a980: 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f  LIMIT means no O
a990: 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70  FFSET */.  if( p
a9a0: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
a9b0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
a9c0: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
a9d0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
a9e0: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
a9f0: 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
aa00: 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
aa10: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
aa20: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
aa30: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
aa40: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
aa50: 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
aa60: 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
aa70: 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
aa80: 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
aa90: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
aaa0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
aab0: 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  Tab;.  if( NEVER
aac0: 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75  (pTab==0) ) retu
aad0: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
aae0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
aaf0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
ab00: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
ab10: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
ab20: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
ab30: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
ab40: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
ab50: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
ab60: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
ab70: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
ab80: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
ab90: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
aba0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  urn 0;       /* 
abb0: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  One column in th
abc0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
abd0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
abe0: 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
abf0: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
ac00: 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73   0; /* Result is
ac10: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72   a column */.  r
ac20: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
ac30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ac40: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
ac50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ac60: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
ac70: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ac80: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
ac90: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27  operator..** It'
aca0: 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64  s job is to find
acb0: 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
acc0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ree structure th
acd0: 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a  at may be used.*
ace0: 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74  * either to test
acf0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
ad00: 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  of the (...) set
ad10: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
ad20: 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65  hrough.** its me
ad30: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
ad40: 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
ad50: 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * The index of t
ad60: 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64  he cursor opened
ad70: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 28   on the b-tree (
ad80: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
ad90: 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a  database index .
ada0: 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74  ** or ephermal t
adb0: 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20  able) is stored 
adc0: 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65  in pX->iTable be
add0: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
ade0: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54  on returns..** T
adf0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
ae00: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
ae10: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
ae20: 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
ae30: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ae40: 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
ae50: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
ae60: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
ae70: 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
ae80: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
ae90: 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  X - The cursor w
aea0: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
aeb0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a  atabase index..*
aec0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
aed0: 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20   -   The cursor 
aee0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
aef0: 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65  specially create
af00: 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  d and.**        
af10: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
af20: 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
af30: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  table..**.** An 
af40: 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
af50: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
af60: 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
af70: 73 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 0a  s of the simple.
af80: 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ** form:.**.**  
af90: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
afa0: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
afb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e  **.** If the prN
afc0: 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  otFound paramete
afd0: 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65  r is 0, then the
afe0: 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
aff0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
b000: 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
b010: 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70  et members, skip
b020: 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61  ping any duplica
b030: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
b040: 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61  e an.** epherema
b050: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
b060: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
b070: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
b080: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
b090: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
b0a0: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
b0b0: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
b0c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
b0d0: 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49   it.** has a UNI
b0e0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
b0f0: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a  r UNIQUE index..
b100: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e  **.** If the prN
b110: 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  otFound paramete
b120: 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
b130: 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
b140: 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
b150: 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72   fast set member
b160: 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74  ship tests. In t
b170: 68 69 73 20 63 61 73 65 20 61 6e 20 65 70 68 65  his case an ephe
b180: 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
b190: 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c   .** be used unl
b1a0: 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ess <column> is 
b1b0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
b1c0: 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64  RY KEY or an ind
b1d0: 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f  ex can .** be fo
b1e0: 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e  und with <column
b1f0: 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
b200: 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  st column..**.**
b210: 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
b220: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
b230: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
b240: 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
b250: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65   function.** nee
b260: 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ds to know wheth
b270: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 74  er or not the st
b280: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
b290: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a   an SQL NULL .**
b2a0: 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20   value in order 
b2b0: 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76 61  to correctly eva
b2c0: 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
b2d0: 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59 2c  s like "X IN (Y,
b2e0: 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72   Z)"..** If ther
b2f0: 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
b300: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
b310: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
b320: 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
b330: 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
b340: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
b350: 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
b360: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
b370: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e  itten.** to *prN
b380: 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72  otFound. If ther
b390: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
b3a0: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
b3b0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
b3c0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
b3d0: 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74  NotFound is left
b3e0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
b3f0: 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
b400: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
b410: 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
b420: 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f  ored in *prNotFo
b430: 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73  und, then.** its
b440: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69   initial value i
b450: 73 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68 65 20  s NULL.  If the 
b460: 28 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72  (...) does not r
b470: 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a  emain constant.*
b480: 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69  * for the durati
b490: 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  on of the query 
b4a0: 28 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54  (i.e. the SELECT
b4b0: 20 77 69 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e   within the (...
b4c0: 29 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72 65 6c  ).** is a correl
b4d0: 61 74 65 64 20 73 75 62 71 75 65 72 79 29 20 74  ated subquery) t
b4e0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
b4f0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72   the allocated r
b500: 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 72 65  egister is.** re
b510: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68  set to NULL each
b520: 20 74 69 6d 65 20 74 68 65 20 73 75 62 71 75 65   time the subque
b530: 72 79 20 69 73 20 72 65 72 75 6e 2e 20 54 68 69  ry is rerun. Thi
b540: 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20  s allows the.** 
b550: 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64  caller to use vd
b560: 62 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65  be code equivale
b570: 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nt to the follow
b580: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ing:.**.**   if(
b590: 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20   register==NULL 
b5a0: 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75  ){.**     has_nu
b5b0: 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61  ll = <test if da
b5c0: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
b5d0: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20  tains null>.**  
b5e0: 20 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a     register = 1.
b5f0: 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20  **   }.**.** in 
b600: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72  order to avoid r
b610: 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74  unning the <test
b620: 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75   if data structu
b630: 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c  re contains null
b640: 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f  >.** test more o
b650: 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63  ften than is nec
b660: 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  essary..*/.#ifnd
b670: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b680: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
b690: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
b6a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b6b0: 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e  pr *pX, int *prN
b6c0: 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65  otFound){.  Sele
b6d0: 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
b700: 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
b710: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
b720: 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
b750: 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
b760: 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
b770: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
b780: 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
b790: 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
b7a0: 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
b7b0: 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  nt mustBeUnique 
b7c0: 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30  = (prNotFound==0
b7d0: 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
b7e0: 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
b7f0: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
b800: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
b810: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
b820: 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
b830: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
b840: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
b850: 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
b860: 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
b870: 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
b880: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
b890: 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
b8a0: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
b8b0: 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70  p = (ExprHasProp
b8c0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
b8d0: 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70  elect) ? pX->x.p
b8e0: 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69  Select : 0);.  i
b8f0: 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65  f( ALWAYS(pParse
b900: 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73  ->nErr==0) && is
b910: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
b920: 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  t(p) ){.    sqli
b930: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b940: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
b950: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
b960: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
b970: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
b980: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
b990: 45 78 70 72 3b 20 20 20 2f 2a 20 45 78 70 72 65  Expr;   /* Expre
b9a0: 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  ssion <column> *
b9b0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  /.    int iCol =
b9c0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
b9f0: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
ba00: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ba10: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ba20: 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
ba30: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
ba40: 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 54 61 62  coded */.    Tab
ba50: 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53  le *pTab = p->pS
ba60: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20  rc->a[0].pTab;  
ba70: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
ba80: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ble>. */.    int
ba90: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
bac0: 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
bad0: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
bae0: 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  an OP_VerifyCook
baf0: 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  ie and OP_TableL
bb00: 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
bb10: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
bb20: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
bb30: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
bb40: 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
bb50: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
bb60: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
bb70: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
bb80: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
bb90: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
bba0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
bbb0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
bbc0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
bbd0: 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c  lled from two pl
bbe0: 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61  aces. In both ca
bbf0: 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20  ses the vdbe.   
bc00: 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
bc10: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
bc20: 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65  So assume sqlite
bc30: 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c  3GetVdbe() is al
bc40: 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63  ways.    ** succ
bc50: 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20  essful here..   
bc60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76   */.    assert(v
bc70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  );.    if( iCol<
bc80: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
bc90: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
bca0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nMem;.      int 
bcb0: 69 41 64 64 72 3b 0a 0a 20 20 20 20 20 20 69 41  iAddr;..      iA
bcc0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bcd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
bce0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
bcf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
bd00: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
bd10: 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20  1, iMem);..     
bd20: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
bd30: 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
bd40: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
bd50: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
bd60: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
bd70: 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
bd80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
bd90: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
bda0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
bdb0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
bde0: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ariable */..    
bdf0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
be00: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  on sequence used
be10: 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73   by the comparis
be20: 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20  on. If an index 
be30: 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  is to.      ** b
be40: 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  e used in place 
be50: 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c  of a temp-table,
be60: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65   it must be orde
be70: 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20  red according.  
be80: 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63      ** to this c
be90: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
bea0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  e.  */.      Col
beb0: 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
bec0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
bed0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
bee0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70   pX->pLeft, pExp
bef0: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  r);..      /* Ch
bf00: 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
bf10: 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
bf20: 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
bf30: 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  rm the .      **
bf40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
bf50: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
bf60: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63  ffinity of the c
bf70: 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20  olumn. If.      
bf80: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  ** it is not, it
bf90: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
bfa0: 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65   to use any inde
bfb0: 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
bfc0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
bfd0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
bfe0: 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  pX);.      int a
bff0: 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54  ffinity_ok = (pT
c000: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
c010: 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66  ffinity==aff||af
c020: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f==SQLITE_AFF_NO
c030: 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  NE);..      for(
c040: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c050: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
c060: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
c070: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
c080: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
c090: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
c0a0: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
c0b0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
c0c0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c0d0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
c0e0: 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52  zColl[0], 0)==pR
c0f0: 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  eq.         && (
c100: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
c110: 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d   (pIdx->nColumn=
c120: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
c130: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20  ror!=OE_None)). 
c140: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
c150: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
c160: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c170: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
c180: 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  dr;.          ch
c190: 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20  ar *pKey;.  .   
c1a0: 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63         pKey = (c
c1b0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64  har *)sqlite3Ind
c1c0: 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
c1d0: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
c1e0: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
c1f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c200: 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20  OP_If, iMem);.  
c210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c220: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c230: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d  Integer, 1, iMem
c240: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
c250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c260: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
c270: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
c280: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
c2b0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
c2c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
c2d0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
c2e0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
c2f0: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
c300: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
c310: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
c320: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c330: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
c340: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
c350: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
c360: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
c370: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
c380: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
c390: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
c3a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c3c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
c3d0: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
c3e0: 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e  * Could not foun
c3f0: 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
c400: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
c410: 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
c420: 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
c430: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
c440: 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
c450: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
c460: 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
c470: 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
c480: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
c490: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
c4a0: 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e 6f  PH;.    if( prNo
c4b0: 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20  tFound ){.      
c4c0: 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d  *prNotFound = rM
c4d0: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
c4e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c4f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 70   }else if( pX->p
c500: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Left->iColumn<0 
c510: 26 26 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  && !ExprHasAnyPr
c520: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
c530: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
c540: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
c550: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a  EX_ROWID;.    }.
c560: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
c570: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
c580: 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
c590: 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
c5a0: 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 7d 65 6c  EX_ROWID);.  }el
c5b0: 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
c5c0: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20  le = iTab;.  }. 
c5d0: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
c5e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
c5f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
c600: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
c610: 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65 78  es used as an ex
c620: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20  pression.** and 
c630: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
c640: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
c650: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
c660: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
c670: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
c680: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
c690: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
c6a0: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
c6b0: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
c6c0: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
c6d0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
c6e0: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
c6f0: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
c700: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
c710: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
c720: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
c730: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
c740: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
c750: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
c760: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
c770: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
c780: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
c790: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
c7a0: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
c7b0: 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
c7c0: 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
c7d0: 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
c7e0: 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
c7f0: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
c800: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
c810: 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
c820: 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
c830: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
c840: 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
c850: 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
c860: 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
c870: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
c880: 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
c890: 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
c8a0: 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
c8b0: 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
c8c0: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
c8d0: 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
c8e0: 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
c8f0: 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
c900: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
c910: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
c920: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
c930: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
c940: 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
c950: 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
c960: 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
c970: 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
c980: 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d  LLs..** Furtherm
c990: 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69  ore, the IN is i
c9a0: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
c9b0: 20 61 6e 64 20 74 68 61 74 20 77 65 20 72 65 61   and that we rea
c9c0: 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69  lly want.** to i
c9d0: 74 65 72 61 74 65 20 6f 76 65 72 20 74 68 65 20  terate over the 
c9e0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
c9f0: 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20  erator in order 
ca00: 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74  to quickly locat
ca10: 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70  e.** all corresp
ca20: 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65  onding LHS eleme
ca30: 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  nts.  All this r
ca40: 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69  outine does is i
ca50: 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65  nitialize.** the
ca60: 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
ca70: 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  by rMayHaveNull 
ca80: 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e  to NULL.  Callin
ca90: 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  g routines will 
caa0: 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20  take.** care of 
cab0: 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
cac0: 67 69 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20  gister value to 
cad0: 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20  non-NULL if the 
cae0: 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
caf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
cb00: 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c  aveNull is zero,
cb10: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
cb20: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
cb30: 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66   being used.** f
cb40: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
cb50: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  sting only.  The
cb60: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
cb70: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a   initialize any.
cb80: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ** registers to 
cb90: 69 6e 64 69 63 61 74 65 20 74 68 65 20 70 72 65  indicate the pre
cba0: 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e 63 65  sense or absence
cbb0: 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65   of NULLs on the
cbc0: 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20   RHS..**.** For 
cbd0: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
cbe0: 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
cbf0: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
cc00: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
cc10: 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
cc20: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
cc30: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
cc40: 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  rs, the return v
cc50: 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69  alue is 0..*/.#i
cc60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cc70: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
cc80: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
cc90: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
cca0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
ccb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ccc0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
ccd0: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
cce0: 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
ccf0: 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
cd00: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d  ator */.  int rM
cd10: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20  ayHaveNull,     
cd20: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
cd30: 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
cd40: 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
cd50: 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
cd60: 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
cd70: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
cd80: 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
cd90: 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
cda0: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
cdb0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdd0: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
cde0: 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dress */.  int r
cdf0: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
ce20: 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
ce30: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
ce40: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ce50: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45  Parse);.  if( NE
ce60: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
ce70: 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45  rn 0;.  sqlite3E
ce80: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
ce90: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rse);..  /* This
cea0: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
ceb0: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
cec0: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
ced0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
cee0: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
cef0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
cf00: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
cf10: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
cf20: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
cf30: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
cf40: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
cf50: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
cf60: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
cf70: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
cf80: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
cf90: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
cfa0: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
cfb0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
cfc0: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
cfd0: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
cfe0: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
cff0: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
d000: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
d010: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
d020: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
d030: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
d040: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
d050: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
d060: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
d070: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
d080: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
d090: 54 61 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  Tab ){.    int m
d0a0: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
d0b0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
d0c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d0d0: 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74  _If, mem);.    t
d0e0: 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  estAddr = sqlite
d0f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d100: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65  P_Integer, 1, me
d110: 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  m);.    assert( 
d120: 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 70 50  testAddr>0 || pP
d130: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
d140: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20  Failed );.  }.. 
d150: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
d160: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d170: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
d180: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
d190: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
d1a0: 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  fo;.      int ad
d1b0: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64  dr;        /* Ad
d1c0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
d1d0: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
d1e0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
d1f0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
d200: 70 72 2d 3e 70 4c 65 66 74 3b 0a 0a 20 20 20 20  pr->pLeft;..    
d210: 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
d220: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
d230: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d240: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
d250: 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
d260: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66      }..      aff
d270: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
d280: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
d290: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
d2a0: 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
d2b0: 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
d2c0: 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
d2d0: 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
d2e0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
d2f0: 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
d300: 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
d310: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
d320: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
d330: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
d340: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
d350: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
d360: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
d370: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
d380: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
d390: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
d3a0: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
d3b0: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
d3c0: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
d3d0: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
d3e0: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
d3f0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
d400: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
d410: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
d420: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
d430: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
d440: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
d450: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
d460: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
d470: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
d480: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
d490: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
d4a0: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
d4b0: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
d4c0: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
d4d0: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
d4e0: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
d4f0: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
d500: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
d510: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
d520: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
d530: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
d540: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
d550: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
d560: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
d570: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
d580: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
d590: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d5a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
d5b0: 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
d5c0: 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77  ->iTable, !isRow
d5d0: 69 64 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  id);.      memse
d5e0: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
d5f0: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
d600: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
d610: 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20  Field = 1;..    
d620: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
d630: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
d640: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
d650: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
d660: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
d670: 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
d680: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
d690: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d6a0: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
d6b0: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
d6c0: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
d6d0: 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
d6e0: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
d6f0: 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
d700: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d710: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
d720: 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  est;.        Exp
d730: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
d740: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d750: 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  !isRowid );.    
d760: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d770: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
d780: 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d   SRT_Set, pExpr-
d790: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
d7a0: 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74 79 20    dest.affinity 
d7b0: 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a  = (u8)affinity;.
d7c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d7d0: 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
d7e0: 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
d7f0: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
d800: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d810: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d820: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
d830: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
d840: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d860: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
d870: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
d880: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
d890: 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21 3d 30  ALWAYS(pEList!=0
d8a0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d8b0: 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20 20 20  r>0) ){ .       
d8c0: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
d8d0: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
d8e0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
d8f0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
d900: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
d910: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
d920: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
d930: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
d940: 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
d950: 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
d960: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
d970: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
d980: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
d990: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
d9a0: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
d9b0: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
d9c0: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
d9d0: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
d9e0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
d9f0: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
da00: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
da10: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
da20: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
da30: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
da40: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
da50: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
da60: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
da70: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
da80: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
da90: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
daa0: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
dab0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
dac0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
dad0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
dae0: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
daf0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
db00: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
db10: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
db20: 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69  , r3;..        i
db30: 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
db40: 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
db50: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
db60: 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
db70: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
db80: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
db90: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
dba0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
dbb0: 66 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ft);..        /*
dbc0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
dbd0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
dbe0: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
dbf0: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
dc00: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
dc10: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
dc20: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
dc30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
dc40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dc50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dc60: 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
dc70: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
dc80: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
dc90: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
dca0: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
dcb0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
dcc0: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
dcd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
dce0: 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
dcf0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
dd00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
dd10: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
dd20: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
dd30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
dd40: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
dd50: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
dd60: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
dd70: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
dd80: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
dd90: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
dda0: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
ddb0: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
ddc0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
ddd0: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
dde0: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
ddf0: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
de00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
de10: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20     if( testAddr 
de20: 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
de30: 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
de40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
de50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
de60: 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64  oNoop(v, testAdd
de70: 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  r-1, 2);.       
de80: 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20       testAddr = 
de90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
dea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
deb0: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
dec0: 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
ded0: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
dee0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
def0: 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
df00: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
df10: 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
df20: 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
df30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
df40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
df50: 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
df60: 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
df70: 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
df80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
df90: 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
dfa0: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
dfb0: 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
dfc0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
dfd0: 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e000: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e010: 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e040: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
e050: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e060: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e070: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
e080: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
e090: 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  2, r3);.        
e0a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e0b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e0c0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
e0d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
e0e0: 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
e0f0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
e100: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e110: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
e120: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20  nge(pParse, r3, 
e130: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
e140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e150: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
e160: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
e170: 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  le, r2);.       
e180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e190: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
e1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
e1b0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
e1c0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
e1d0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
e1e0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
e1f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e200: 20 69 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b   if( !isRowid ){
e210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e220: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
e230: 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b  addr, (void *)&k
e240: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
e250: 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
e260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e270: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
e280: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
e290: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
e2a0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
e2b0: 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f 20   If this has to 
e2c0: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
e2d0: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
e2e0: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
e2f0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
e300: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
e310: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
e320: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
e330: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
e340: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
e350: 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74  n iColumn.  If t
e360: 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
e370: 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
e380: 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
e390: 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
e3a0: 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20  (exists) into a 
e3b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20  memory cell.    
e3c0: 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20    ** and record 
e3d0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
e3e0: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
e3f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65     */.      Sele
e400: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
e430: 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
e440: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
e450: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e470: 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
e480: 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74  th SELECt result
e490: 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63   */..      testc
e4a0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e4b0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
e4c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e4d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
e4e0: 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
e4f0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
e500: 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72  _EXISTS || pExpr
e510: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
e520: 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
e530: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
e540: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
e550: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
e560: 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  pSel = pExpr->x.
e570: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73  pSelect;.      s
e580: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
e590: 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b  Init(&dest, 0, +
e5a0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a  +pParse->nMem);.
e5b0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
e5c0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
e5d0: 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
e5e0: 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
e5f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e600: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e610: 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50  Null, 0, dest.iP
e620: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
e630: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
e640: 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
e650: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
e660: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
e670: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
e680: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
e690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e6a0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
e6b0: 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20  , dest.iParm);. 
e6c0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
e6d0: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
e6e0: 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
e6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e700: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
e710: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
e720: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
e730: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
e740: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
e750: 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
e760: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33          &sqlite3
e790: 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20  IntTokens[1]);. 
e7a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e7b0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e7c0: 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
e7d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
e7e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e7f0: 52 65 67 20 3d 20 64 65 73 74 2e 69 50 61 72 6d  Reg = dest.iParm
e800: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49  ;.      ExprSetI
e810: 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72  rreducible(pExpr
e820: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e830: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
e840: 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20   testAddr ){.   
e850: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e860: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
e870: 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  -1);.  }.  sqlit
e880: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
e890: 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65  Parse, 1);..  re
e8a0: 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
e8b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e8c0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
e8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e8e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
e8f0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e900: 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
e910: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
e920: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
e930: 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
e940: 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
e950: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
e960: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
e970: 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
e980: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
e990: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e9a0: 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
e9b0: 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
e9c0: 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
e9d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e9e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
e9f0: 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
ea00: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
ea10: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
ea20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ea30: 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
ea40: 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
ea50: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
ea60: 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
ea70: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
ea80: 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
ea90: 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
eaa0: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
eab0: 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
eac0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
ead0: 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70  s code will jump
eae0: 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
eaf0: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
eb00: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
eb10: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
eb20: 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
eb30: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
eb40: 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
eb50: 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
eb60: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
eb70: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
eb80: 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
eb90: 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
eba0: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
ebb0: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
ebc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ebd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ebe0: 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
ebf0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
ec00: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
ec10: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
ec20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
ec30: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
ec40: 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
ec50: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
ec60: 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
ec70: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
ec80: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
ec90: 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
eca0: 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
ecb0: 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
ecc0: 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
ecd0: 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
ece0: 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
ecf0: 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
ed00: 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
ed10: 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
ed20: 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
ed30: 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
ed40: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e   */.  char affin
ed50: 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  ity;        /* C
ed60: 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
ed70: 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69  ty to use */.  i
ed80: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
ed90: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
eda0: 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
edb0: 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
edc0: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
edd0: 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
ede0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
edf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
ee00: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
ee10: 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  ruction */..  /*
ee20: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   Compute the RHS
ee30: 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73  .   After this s
ee40: 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77  tep, the table w
ee50: 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  ith cursor.  ** 
ee60: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69  pExpr->iTable wi
ee70: 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ll contains the 
ee80: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
ee90: 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   up the RHS..  *
eea0: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
eeb0: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
eec0: 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
eed0: 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
eee0: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
eef0: 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
ef00: 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
ef10: 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
ef20: 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
ef30: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
ef40: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52  arse, pExpr, &rR
ef50: 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f  hsHasNull);..  /
ef60: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
ef70: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
ef80: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
ef90: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
efa0: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78  s.  ** of the ex
efb0: 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
efc0: 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
efd0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
efe0: 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50  table for.  ** P
eff0: 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
f000: 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e  rd..  */.  affin
f010: 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
f020: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
f030: 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
f040: 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
f050: 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
f060: 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73  (...)"..  */.  s
f070: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
f080: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72  ush(pParse);.  r
f090: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
f0a0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f0b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f0c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
f0d0: 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f  pLeft, r1);..  /
f0e0: 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  * If the LHS is 
f0f0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
f100: 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72 20  esult is either 
f110: 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65  false or NULL de
f120: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20  pending.  ** on 
f130: 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20  whether the RHS 
f140: 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c  is empty or not,
f150: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
f160: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
f170: 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
f180: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72  e ){.    /* Shor
f190: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d  tcut for the com
f1a0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
f1b0: 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c  he false and NUL
f1c0: 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20  L outcomes are. 
f1d0: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
f1e0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
f1f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f200: 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49  sNull, r1, destI
f210: 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
f220: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d  .    int addr1 =
f230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f240: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
f250: 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
f260: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f270: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
f280: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
f290: 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  False);.    sqli
f2a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f2b0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
f2c0: 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  tIfNull);.    sq
f2d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f2e0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d  e(v, addr1);.  }
f2f0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  ..  if( eType==I
f300: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
f310: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
f320: 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
f330: 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
f340: 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a  ble b-tree.    *
f350: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
f360: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
f370: 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73  stBeInt, r1, des
f380: 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
f390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f3a0: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
f3b0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
f3c0: 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
f3d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f3e0: 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
f3f0: 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69   the RHS is an i
f400: 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20  ndex b-tree..   
f410: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f420: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f430: 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
f440: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
f450: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
f460: 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  e set membership
f470: 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
f480: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
f490: 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  the .    ** "x I
f4a0: 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  N (...)" express
f4b0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68  ion must be eith
f4c0: 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66  er 0 or NULL. If
f4d0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20   the set.    ** 
f4e0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
f4f0: 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
f500: 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
f510: 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a  f the set .    *
f520: 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
f530: 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
f540: 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
f550: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
f560: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
f570: 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  also NULL..    *
f580: 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73 48 61  /.    if( rRhsHa
f590: 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74  sNull==0 || dest
f5a0: 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
f5b0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
f5c0: 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
f5d0: 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
f5e0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
f5f0: 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20  that the RHS.   
f600: 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e     ** cannot con
f610: 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73  tain NULL values
f620: 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61  . This happens a
f630: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  s the result.   
f640: 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20     ** of a "NOT 
f650: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
f660: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
f670: 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a   schema..      *
f680: 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20  *.      ** Also 
f690: 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20  run this branch 
f6a0: 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76  if NULL is equiv
f6b0: 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20  alent to FALSE. 
f6c0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
f6d0: 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
f6e0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a  perator..      *
f6f0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
f700: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
f710: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
f720: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
f730: 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
f740: 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ..    }else{.   
f750: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
f760: 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
f770: 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
f780: 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
f790: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
f7a0: 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c  esence of a NULL
f7b0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65   on the RHS make
f7c0: 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69  s a difference i
f7d0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f  n the.      ** o
f7e0: 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f  utcome..      */
f7f0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  .      int j1, j
f800: 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a  2, j3;..      /*
f810: 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
f820: 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
f830: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
f840: 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
f850: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
f860: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
f870: 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
f880: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20  oes not matter, 
f890: 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a  so jump.      **
f8a0: 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
f8b0: 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
f8c0: 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ws..      */.   
f8d0: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
f8e0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
f8f0: 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
f900: 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
f910: 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65  1);..      /* He
f920: 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65  re we begin gene
f930: 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74  rating code that
f940: 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53   runs if the LHS
f950: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
f960: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
f970: 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65  n the RHS.  Gene
f980: 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  rate additional 
f990: 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20 20  code that.      
f9a0: 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48 53  ** tests the RHS
f9b0: 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20   for NULLs.  If 
f9c0: 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
f9d0: 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20   a NULL then.   
f9e0: 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
f9f0: 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
fa00: 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73  ere are no NULLs
fa10: 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
fa20: 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
fa30: 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20  o destIfFalse.. 
fa40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32       */.      j2
fa50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fa60: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
fa70: 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29  ll, rRhsHasNull)
fa80: 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c  ;.      j3 = sql
fa90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
faa0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
fab0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
fac0: 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
fad0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fae0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
faf0: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68  Integer, -1, rRh
fb00: 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
fb10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fb20: 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20  Here(v, j3);.   
fb30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb40: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
fb50: 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  m, rRhsHasNull, 
fb60: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
fb70: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fb80: 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   j2);..      /* 
fb90: 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72  Jump to the appr
fba0: 6f 70 72 69 61 74 65 20 74 61 72 67 65 74 20 64  opriate target d
fbb0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
fbc0: 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20  her or not.     
fbd0: 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74   ** the RHS cont
fbe0: 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20  ains a NULL.    
fbf0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
fc00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc10: 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75  OP_If, rRhsHasNu
fc20: 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
fc30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fc40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
fc50: 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
fc60: 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  lse);..      /* 
fc70: 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20  The OP_Found at 
fc80: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
fc90: 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72  branch jumps her
fca0: 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20  e when true, .  
fcb0: 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74      ** causing t
fcc0: 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78  he overall IN ex
fcd0: 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
fce0: 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f  ion to fall thro
fcf0: 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
fd00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fd10: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
fd20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
fd30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
fd40: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
fd50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
fd60: 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
fd70: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
fd80: 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
fd90: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
fda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fdb0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
fdc0: 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
fdd0: 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
fde0: 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
fdf0: 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
fe00: 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
fe10: 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
fe20: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
fe30: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
fe40: 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
fe50: 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
fe60: 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
fe70: 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69  eturn out;.}..#i
fe80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fe90: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
fea0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
feb0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
fec0: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
fed0: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
fee0: 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
fef0: 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
ff00: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
ff10: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
ff20: 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
ff30: 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
ff40: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
ff50: 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
ff60: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
ff70: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
ff80: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
ff90: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
ffa0: 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
ffb0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
ffc0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
ffd0: 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
ffe0: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
fff0: 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
10000 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
10010 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
10020 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
10030 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20  value;.    char 
10040 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *zV;.    sqlite3
10050 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b  AtoF(z, &value);
10060 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
10070 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
10080 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
10090 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
100a0 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
100b0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
100c0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
100d0 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
100e0 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
100f0 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
10100 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
10110 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
10120 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b  0, zV, P4_REAL);
10130 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
10140 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
10150 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
10160 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
10170 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
10180 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
10190 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
101a0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
101b0 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
101c0 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
101d0 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
101e0 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
101f0 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
10200 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
10210 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
10220 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
10230 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
10240 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
10250 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
10260 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
10270 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
10280 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
10290 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
102a0 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
102b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
102c0 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
102d0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
102e0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
102f0 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
10300 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  lue;.    if( neg
10310 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
10320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10330 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10340 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
10350 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
10360 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
10370 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
10380 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
10390 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
103a0 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e  itsIn64Bits(z, n
103b0 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
103c0 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
103d0 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
103e0 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28    sqlite3Atoi64(
103f0 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
10400 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
10410 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
10420 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
10430 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
10440 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
10450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10460 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
10470 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
10480 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
10490 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
104a0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
104b0 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
104c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
104d0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
104e0 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
104f0 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
10500 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , z);.#else.    
10510 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
10520 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
10530 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
10540 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  }.}../*.** Clear
10550 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a   a cache entry..
10560 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10570 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
10580 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
10590 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
105a0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d  p){.  if( p->tem
105b0 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
105c0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
105d0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
105e0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
105f0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
10600 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
10610 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e  TempReg++] = p->
10620 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iReg;.    }.    
10630 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
10640 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65    }.}.../*.** Re
10650 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  cord in the colu
10660 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20  mn cache that a 
10670 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d  particular colum
10680 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74  n from a.** part
10690 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20  icular table is 
106a0 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74  stored in a part
106b0 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
106c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
106d0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50  ExprCacheStore(P
106e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
106f0 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c  t iTab, int iCol
10700 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
10710 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c  nt i;.  int minL
10720 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75  ru;.  int idxLru
10730 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
10740 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65  ache *p;..  asse
10750 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f  rt( iReg>0 );  /
10760 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65  * Register numbe
10770 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
10780 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65  sitive */.  asse
10790 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
107a0 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
107b0 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
107c0 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
107d0 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
107e0 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
107f0 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
10800 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
10810 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
10820 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
10830 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
10840 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
10850 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
10860 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
10870 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
10880 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
10890 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
108a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
108b0 6c 75 6d 6e 43 61 63 68 65 20 29 20 72 65 74 75  lumnCache ) retu
108c0 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
108d0 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
108e0 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
108f0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
10900 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
10910 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
10920 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
10930 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
10940 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
10950 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
10960 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
10970 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
10980 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
10990 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
109a0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
109b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
109c0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
109d0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 23  HE; i++, p++){.#
109e0 69 66 20 30 20 2f 2a 20 54 68 69 73 20 63 6f 64  if 0 /* This cod
109f0 65 20 77 6f 6c 64 20 72 65 6d 6f 76 65 20 74 68  e wold remove th
10a00 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  e entry from the
10a10 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
10a20 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  sted */.    if( 
10a30 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54  p->iReg && p->iT
10a40 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d  able==iTab && p-
10a50 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29  >iColumn==iCol )
10a60 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
10a70 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
10a80 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65  p);.      p->iLe
10a90 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
10aa0 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
10ab0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
10ac0 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
10ad0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
10ae0 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
10af0 6e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  n;.    }.#endif.
10b00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
10b10 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61  Reg==0 || p->iTa
10b20 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
10b30 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
10b40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
10b50 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20  * Find an empty 
10b60 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65  slot and replace
10b70 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30   it */.  for(i=0
10b80 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
10b90 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
10ba0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
10bb0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
10bc0 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->iReg==0 ){.   
10bd0 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
10be0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
10bf0 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61  el;.      p->iTa
10c00 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
10c10 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
10c20 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  Col;.      p->iR
10c30 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
10c40 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
10c50 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
10c60 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
10c70 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
10c80 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
10c90 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
10ca0 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
10cb0 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
10cc0 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
10cd0 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
10ce0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
10cf0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
10d00 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
10d10 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
10d20 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
10d30 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
10d40 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
10d50 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
10d60 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
10d70 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
10d80 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
10d90 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
10da0 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
10db0 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
10dc0 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
10dd0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
10de0 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
10df0 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
10e00 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
10e10 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
10e20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
10e30 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
10e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
10e50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
10e60 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
10e70 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
10e80 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
10e90 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
10ea0 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
10eb0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
10ec0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
10ed0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
10ee0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
10ef0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
10f00 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
10f10 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
10f20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61  int i;.  int iLa
10f30 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67  st = iReg + nReg
10f40 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79   - 1;.  struct y
10f50 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
10f60 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
10f70 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
10f80 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
10f90 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
10fa0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
10fb0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65  ;.    if( r>=iRe
10fc0 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b  g && r<=iLast ){
10fd0 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
10fe0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
10ff0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
11000 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
11010 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
11020 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
11030 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
11040 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
11050 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
11060 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
11070 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
11080 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
11090 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
110a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
110b0 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
110c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
110d0 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
110e0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
110f0 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
11100 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
11110 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
11120 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65  cache any entrie
11130 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65  s that were adde
11140 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74  d since the.** t
11150 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75  he previous N Pu
11160 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  sh operations.  
11170 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
11180 72 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68  restore the cach
11190 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74  e.** to the stat
111a0 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75  e it was in N Pu
111b0 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69  shes ago..*/.voi
111c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
111d0 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  hePop(Parse *pPa
111e0 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  rse, int N){.  i
111f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
11200 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
11210 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20  ssert( N>0 );.  
11220 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
11230 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29  iCacheLevel>=N )
11240 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
11250 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20  heLevel -= N;.  
11260 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11270 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11280 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11290 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
112a0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
112b0 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73   p->iLevel>pPars
112c0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
112d0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
112e0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
112f0 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
11300 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
11310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
11320 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
11330 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
11340 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
11350 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
11360 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
11370 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
11380 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
11390 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
113a0 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
113b0 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
113c0 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
113d0 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
113e0 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
113f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
11400 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11410 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
11420 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11430 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
11440 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
11450 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
11460 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11470 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11480 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11490 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
114a0 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
114b0 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
114c0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
114d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
114e0 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
114f0 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
11500 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
11510 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
11520 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11530 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
11540 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
11550 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
11560 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
11570 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
11580 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
11590 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
115a0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
115b0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
115c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  ,    /* The curs
115d0 6f 72 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  or for this tabl
115e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  e */.  int iCol,
115f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11600 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
11610 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
11620 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
11630 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
11640 75 64 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ud into this reg
11650 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
11660 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
11670 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
11680 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11690 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
116a0 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
116b0 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
116c0 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
116d0 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
116e0 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
116f0 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
11700 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
11710 70 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  p, iTabCur, iCol
11720 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
11730 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
11740 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
11750 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
11760 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
11770 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
11780 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
11790 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
117a0 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
117b0 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
117c0 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
117d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
117e0 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
117f0 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
11800 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
11810 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
11820 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
11830 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
11840 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
11850 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
11860 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
11870 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
11880 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
11890 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
118a0 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
118b0 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
118c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
118d0 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
118e0 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
118f0 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
11900 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
11910 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
11920 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
11930 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
11940 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
11950 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
11960 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
11970 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
11980 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
11990 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
119a0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
119b0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
119c0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
119d0 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
119e0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
119f0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
11a00 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
11a10 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
11a20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
11a30 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
11a40 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
11a50 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
11a60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
11a70 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
11a80 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
11a90 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11aa0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11ab0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11ac0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11ad0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e      if( p->iReg>
11ae0 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  0 && p->iTable==
11af0 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
11b00 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
11b10 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
11b20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
11b30 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
11b40 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
11b50 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
11b60 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
11b70 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
11b80 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
11b90 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
11ba0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
11bb0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
11bc0 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
11bd0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
11be0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
11bf0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
11c00 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
11c10 20 69 52 65 67 29 3b 0a 20 20 72 65 74 75 72 6e   iReg);.  return
11c20 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
11c30 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
11c40 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
11c50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
11c60 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
11c70 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
11c80 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
11c90 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
11ca0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11cb0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11cc0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11cd0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11ce0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
11cf0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
11d00 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
11d10 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
11d20 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
11d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
11d40 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
11d50 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
11d60 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
11d70 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
11d80 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
11d90 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
11da0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11db0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
11dc0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
11dd0 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
11de0 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
11df0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
11e00 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
11e10 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
11e20 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11e30 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
11e40 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
11e50 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
11e60 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
11e70 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
11e80 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
11e90 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
11ea0 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
11eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
11ec0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
11ed0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
11ee0 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
11ef0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
11f00 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
11f10 20 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f    if( NEVER(iFro
11f20 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e  m==iTo) ) return
11f30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11f40 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
11f50 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
11f60 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
11f70 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
11f80 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
11f90 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
11fa0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11fb0 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e  .    int x = p->
11fc0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e  iReg;.    if( x>
11fd0 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f  =iFrom && x<iFro
11fe0 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20  m+nReg ){.      
11ff0 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69  p->iReg += iTo-i
12000 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  From;.    }.  }.
12010 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
12020 65 20 63 6f 64 65 20 74 6f 20 63 6f 70 79 20 63  e code to copy c
12030 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
12040 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
12050 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
12060 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
12070 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Reg-1..*/.void s
12080 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
12090 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
120a0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
120b0 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
120c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
120d0 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f  NEVER(iFrom==iTo
120e0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
120f0 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69  r(i=0; i<nReg; i
12100 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
12110 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
12120 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
12130 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b  y, iFrom+i, iTo+
12140 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  i);.  }.}..#if d
12150 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
12160 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
12170 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
12180 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
12190 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
121a0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
121b0 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
121c0 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
121d0 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
121e0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
121f0 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
12200 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
12210 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
12220 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
12230 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
12240 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
12250 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
12260 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
12270 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
12280 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
12290 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
122a0 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
122b0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
122c0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
122d0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
122e0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
122f0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12300 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
12310 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
12320 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
12330 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
12340 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
12350 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
12360 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
12370 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
12380 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
12390 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  EST */../*.** If
123a0 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
123b0 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20 61  ction coded is a
123c0 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70 79  n ephemeral copy
123d0 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68   of any of.** th
123e0 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 74  e registers in t
123f0 68 65 20 6e 52 65 67 20 72 65 67 69 73 74 65 72  he nReg register
12400 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
12410 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63   iReg, then.** c
12420 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74 20  onvert the last 
12430 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d  instruction from
12440 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f   OP_SCopy to OP_
12450 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Copy..*/.void sq
12460 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70  lite3ExprHardCop
12470 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
12480 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
12490 52 65 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Reg){.  VdbeOp *
124a0 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  pOp;.  Vdbe *v;.
124b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
124c0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
124d0 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 76 20 3d 20  led==0 );.  v = 
124e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
124f0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12500 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33  .  pOp = sqlite3
12510 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29  VdbeGetOp(v, -1)
12520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 21  ;.  assert( pOp!
12530 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
12540 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70  >opcode==OP_SCop
12550 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d 69 52  y && pOp->p1>=iR
12560 65 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c 69 52  eg && pOp->p1<iR
12570 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 70  eg+nReg ){.    p
12580 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
12590 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Copy;.  }.}../*.
125a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
125b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61   to store the va
125c0 6c 75 65 20 6f 66 20 74 68 65 20 69 41 6c 69 61  lue of the iAlia
125d0 73 2d 74 68 20 61 6c 69 61 73 20 69 6e 20 72 65  s-th alias in re
125e0 67 69 73 74 65 72 0a 2a 2a 20 74 61 72 67 65 74  gister.** target
125f0 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
12600 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  e this is called
12610 2c 20 70 45 78 70 72 20 69 73 20 65 76 61 6c 75  , pExpr is evalu
12620 61 74 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a  ated to compute.
12630 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
12640 74 68 65 20 61 6c 69 61 73 2e 20 20 54 68 65 20  the alias.  The 
12650 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20  value is stored 
12660 69 6e 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  in an auxiliary 
12670 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
12680 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
12690 61 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72  at register is r
126a0 65 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73 75 62  eturned.  On sub
126b0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 0a 2a  sequent calls,.*
126c0 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  * the register n
126d0 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e 65  umber is returne
126e0 64 20 77 69 74 68 6f 75 74 20 67 65 6e 65 72 61  d without genera
126f0 74 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e 0a 2a  ting any code..*
12700 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
12710 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  n order for this
12720 20 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65 20 6d   to work, code m
12730 75 73 74 20 62 65 20 67 65 6e 65 72 61 74 65 64  ust be generated
12740 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   in the.** same 
12750 6f 72 64 65 72 20 74 68 61 74 20 69 74 20 69 73  order that it is
12760 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a   executed..**.**
12770 20 41 6c 69 61 73 65 73 20 61 72 65 20 6e 75 6d   Aliases are num
12780 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 77  bered starting w
12790 69 74 68 20 31 2e 20 20 53 6f 20 69 41 6c 69 61  ith 1.  So iAlia
127a0 73 20 69 73 20 69 6e 20 74 68 65 20 72 61 6e 67  s is in the rang
127b0 65 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70 50 61  e.** of 1 to pPa
127c0 72 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e 63 6c  rse->nAlias incl
127d0 75 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 70  usive.  .**.** p
127e0 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41  Parse->aAlias[iA
127f0 6c 69 61 73 2d 31 5d 20 72 65 63 6f 72 64 73 20  lias-1] records 
12800 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
12810 62 65 72 20 77 68 65 72 65 20 74 68 65 20 76 61  ber where the va
12820 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 41  lue.** of the iA
12830 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69 73  lias-th alias is
12840 20 73 74 6f 72 65 64 2e 20 20 49 66 20 7a 65 72   stored.  If zer
12850 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
12860 61 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  at the.** alias 
12870 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
12880 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74   computed..*/.st
12890 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 69  atic int codeAli
128a0 61 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  as(Parse *pParse
128b0 2c 20 69 6e 74 20 69 41 6c 69 61 73 2c 20 45 78  , int iAlias, Ex
128c0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
128d0 61 72 67 65 74 29 7b 0a 23 69 66 20 30 0a 20 20  arget){.#if 0.  
128e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
128f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
12900 69 52 65 67 3b 0a 20 20 69 66 28 20 70 50 61 72  iReg;.  if( pPar
12910 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3c  se->nAliasAlloc<
12920 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29  pParse->nAlias )
12930 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41  {.    pParse->aA
12940 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
12950 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62  ReallocOrFree(db
12960 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73  , pParse->aAlias
12970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65     sizeof(pParse
129a0 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70 50 61  ->aAlias[0])*pPa
129b0 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20  rse->nAlias );. 
129c0 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
129d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
129e0 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41   pParse->nAliasA
129f0 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20 20 69 66  lloc>0 );.    if
12a00 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12a10 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
12a20 20 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73     memset(&pPars
12a30 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61 72 73 65  e->aAlias[pParse
12a40 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 5d 2c 20  ->nAliasAlloc], 
12a50 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  0,.           (p
12a60 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 2d 70 50  Parse->nAlias-pP
12a70 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f  arse->nAliasAllo
12a80 63 29 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  c)*sizeof(pParse
12a90 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29 3b 0a 20  ->aAlias[0]));. 
12aa0 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61     pParse->nAlia
12ab0 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72 73 65 2d  sAlloc = pParse-
12ac0 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 61  >nAlias;.  }.  a
12ad0 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e 30 20  ssert( iAlias>0 
12ae0 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61 72 73  && iAlias<=pPars
12af0 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20 69  e->nAlias );.  i
12b00 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  Reg = pParse->aA
12b10 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 3b 0a  lias[iAlias-1];.
12b20 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20 29 7b    if( iReg==0 ){
12b30 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12b40 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 30 20 29  >iCacheLevel>0 )
12b50 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20 73  {.      iReg = s
12b60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
12b70 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
12b80 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
12b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
12ba0 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
12bb0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
12bc0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12bd0 65 2c 20 70 45 78 70 72 2c 20 69 52 65 67 29 3b  e, pExpr, iReg);
12be0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
12bf0 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20  Alias[iAlias-1] 
12c00 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  = iReg;.    }.  
12c10 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
12c20 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
12c30 50 41 52 41 4d 45 54 45 52 28 69 41 6c 69 61 73  PARAMETER(iAlias
12c40 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
12c50 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
12c60 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
12c70 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
12c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
12c90 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
12ca0 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
12cb0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
12cc0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
12cd0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
12ce0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12cf0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
12d00 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
12d10 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
12d20 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
12d30 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
12d40 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
12d50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
12d60 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
12d70 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
12d80 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
12d90 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
12da0 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
12db0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
12dc0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
12dd0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
12de0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
12df0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
12e00 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
12e10 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
12e20 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
12e30 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
12e40 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
12e50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12e60 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
12e70 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
12e80 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
12e90 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
12ea0 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
12eb0 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
12ec0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
12ed0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
12ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
12ef0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
12f00 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
12f10 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
12f20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
12f30 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
12f40 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
12f50 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
12f60 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
12f70 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
12f80 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
12f90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
12fa0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
12fb0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
12fc0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
12fd0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
12fe0 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20  int r1, r2, r3, 
12ff0 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72  r4;       /* Var
13000 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
13010 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
13020 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13030 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
13040 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13050 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  */..  assert( ta
13060 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
13070 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
13080 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
13090 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
130a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
130b0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
130c0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
130d0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
130e0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
130f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
13100 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
13110 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
13120 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
13130 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
13140 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
13150 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
13160 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
13170 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
13180 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
13190 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
131a0 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
131b0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
131c0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
131d0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
131e0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
131f0 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
13200 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
13210 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13220 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
13230 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
13240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13250 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
13260 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
13270 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
132a0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
132b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
132c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
132d0 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
132e0 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
132f0 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
13300 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
13310 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
13320 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
13330 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
13340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
13350 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
13360 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
13370 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
13380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13390 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
133a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
133b0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
133c0 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
133d0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
133e0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
133f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
13400 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
13410 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13440 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  Expr->iColumn, p
13450 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
13460 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
13470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13480 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
13490 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
134a0 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
134b0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  e, pExpr, 0, tar
134c0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
134d0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
134e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
134f0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
13500 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
13510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13520 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13530 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
13540 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
13550 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
13560 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
13570 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
13580 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
13590 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
135a0 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
135b0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
135c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
135d0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
135e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
135f0 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
13600 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c  8, 0, target, 0,
13610 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13620 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
13630 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13640 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
13650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13660 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
13670 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
13680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13690 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
136a0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
136b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
136c0 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
136d0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
136e0 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
136f0 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
13700 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13710 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13720 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13740 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
13750 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
13760 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
13770 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13780 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
13790 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
137a0 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
137b0 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
137c0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
137d0 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
137e0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
137f0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
13800 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
13810 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
13820 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
13830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13840 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13850 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
13860 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
13870 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
13880 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
13890 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
138a0 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
138b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
138c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
138d0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
138e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
138f0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13900 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
13910 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
13920 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
13930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13940 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
13950 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
13960 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
13970 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
13980 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
13990 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
139a0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
139b0 20 2d 31 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54   -1, pExpr->u.zT
139c0 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
139d0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
139e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
139f0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
13a00 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
13a10 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
13a20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13a30 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
13a40 20 20 20 20 20 69 6e 52 65 67 20 3d 20 63 6f 64       inReg = cod
13a50 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70  eAlias(pParse, p
13a60 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
13a70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
13a80 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13a90 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
13ab0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
13ac0 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
13ad0 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
13ae0 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
13af0 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
13b00 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
13b10 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52  to_op;.      inR
13b20 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
13b30 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
13b40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13b50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13b60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13b70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13b80 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13b90 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
13ba0 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
13bb0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
13bc0 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20  ;.      to_op = 
13bd0 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  aff - SQLITE_AFF
13be0 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78  _TEXT + OP_ToTex
13bf0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
13c00 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
13c10 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  t    || aff!=SQL
13c20 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
13c30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13c40 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
13c50 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  b    || aff!=SQL
13c60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
13c70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13c80 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
13c90 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c  eric || aff!=SQL
13ca0 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
13cb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13cc0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
13cd0 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c       || aff!=SQL
13ce0 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
13cf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13d00 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
13d10 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  l    || aff!=SQL
13d20 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
13d30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13d40 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  e( to_op==OP_ToT
13d50 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ext );.      tes
13d60 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
13d70 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  _ToBlob );.     
13d80 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
13d90 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29  ==OP_ToNumeric )
13da0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13db0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e  ( to_op==OP_ToIn
13dc0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
13dd0 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
13de0 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69  oReal );.      i
13df0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
13e00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13e10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13e20 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
13e30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
13e40 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
13e50 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
13e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13e70 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52  p1(v, to_op, inR
13e80 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  eg);.      testc
13e90 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d  ase( usedAsColum
13ea0 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
13eb0 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a  nReg, inReg) );.
13ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13ed0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
13ee0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ange(pParse, inR
13ef0 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  eg, 1);.      br
13f00 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
13f10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13f20 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
13f30 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
13f40 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
13f50 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
13f60 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
13f70 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
13f80 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
13f90 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
13fa0 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
13fb0 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
13fc0 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
13fd0 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
13fe0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
13ff0 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
14000 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14010 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
14020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14030 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
14040 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14050 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
14060 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14070 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
14080 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14090 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
140a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
140b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
140c0 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
140d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
140e0 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
140f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
14100 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
14110 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14120 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
14130 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
14140 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14150 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
14160 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
14170 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
14180 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14190 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
141a0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
141c0 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
141d0 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
141e0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
141f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14200 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14210 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14220 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14230 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
14240 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
14250 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
14260 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
14270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14280 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
14290 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
142a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
142b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
142c0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
142d0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
142e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
142f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14300 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
14310 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
14320 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
14330 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
14340 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
14350 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14360 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
14370 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
14380 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
14390 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
143a0 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e  OREP2 | SQLITE_N
143b0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
143c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
143d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
143e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
143f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
14400 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14410 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
14420 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
14430 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
14440 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
14450 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
14460 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
14470 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
14480 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
14490 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
144a0 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
144b0 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
144c0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
144d0 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
144e0 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
144f0 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
14500 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
14510 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
14520 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
14530 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
14540 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
14550 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
14560 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
14570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14580 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
14590 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
145a0 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
145b0 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
145c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
145d0 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
145e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
145f0 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
14600 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
14610 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
14620 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
14630 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14640 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
14650 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
14660 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
14670 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
14680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14690 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
146a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
146b0 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
146c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
146d0 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74  _PLUS );.      t
146e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
146f0 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74  MINUS );.      t
14700 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14710 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73  REM );.      tes
14720 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
14730 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65  TAND );.      te
14740 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
14750 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  ITOR );.      te
14760 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
14770 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65  LASH );.      te
14780 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
14790 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74  SHIFT );.      t
147a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
147b0 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
147c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
147d0 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20  _CONCAT );.     
147e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
147f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14800 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14810 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
14820 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
14830 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14840 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
14850 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
14860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14870 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c  ddOp3(v, op, r2,
14880 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
14890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
148a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
148b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
148c0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
148d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
148e0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
148f0 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
14900 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
14910 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
14920 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
14930 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
14940 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
14950 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74  .        codeInt
14960 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  eger(pParse, pLe
14970 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  ft, 1, target);.
14980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14990 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
149a0 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
149b0 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
149c0 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
149d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
149e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
149f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
14a00 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
14a10 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
14a20 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
14a30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14a50 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73  egFree1 = r1 = s
14a60 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
14a70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
14a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14a90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14aa0 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20  r, 0, r1);.     
14ab0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
14ac0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
14ad0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14ae0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
14af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14b00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
14b10 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
14b20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
14b30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14b40 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
14b50 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
14b60 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
14b70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14b80 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
14b90 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
14ba0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14bb0 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
14bc0 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
14bd0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
14be0 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65  _Not );.      te
14bf0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
14c00 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  ITNOT );.      t
14c10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14c20 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
14c30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14c40 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14c50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
14c60 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
14c70 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
14c80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ==0 );.      inR
14c90 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
14ca0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14cb0 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
14cc0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
14cd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14ce0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
14cf0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
14d00 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
14d10 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
14d20 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
14d30 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
14d40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
14d50 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
14d60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14d70 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
14d80 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
14d90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
14da0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
14db0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14dc0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
14dd0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14de0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14df0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14e00 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14e10 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14e20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14e30 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14e40 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
14e50 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
14e60 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
14e70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14e80 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
14e90 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
14ea0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14eb0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
14ec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14ed0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
14ee0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
14ef0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
14f00 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
14f10 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
14f20 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
14f30 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
14f40 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14f50 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
14f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14f70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14f80 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
14f90 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
14fa0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
14fb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14fc0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e       inReg = pIn
14fd0 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
14fe0 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
14ff0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15010 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
15020 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
15030 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
15040 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
15050 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
15060 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
15070 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
15080 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
15090 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
150a0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
150b0 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
150c0 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
150d0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
150e0 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
150f0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
15100 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
15110 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
15120 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
15130 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
15140 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15150 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
15160 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
15170 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  e */.      int c
15180 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
15190 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
151a0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
151b0 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
151c0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
151d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
151e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
151f0 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
15200 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
15210 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
15220 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
15230 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
15240 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
15250 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
15260 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
15270 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
15280 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15290 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
152a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
152b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
152c0 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  op==TK_CONST_FUN
152d0 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  C );.      testc
152e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ase( op==TK_FUNC
152f0 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  TION );.      if
15300 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
15310 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
15320 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
15330 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
15340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15350 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
15360 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
15370 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
15380 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
15390 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
153a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
153b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
153c0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
153d0 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
153e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
153f0 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69        nId = sqli
15400 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29  te3Strlen30(zId)
15410 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
15420 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
15430 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  on(db, zId, nId,
15440 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
15450 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
15460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
15470 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15480 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
15490 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22  unction: %.*s()"
154a0 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
154b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
154c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
154d0 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
154e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
154f0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
15500 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
15510 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
15520 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
15530 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
15540 72 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a  ry evalation of.
15550 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
15560 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
15570 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
15580 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
15590 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c      if( pDef->fl
155a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
155b0 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
155c0 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
155d0 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
155e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
155f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15600 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
15610 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15620 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
15630 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
15640 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
15650 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
15660 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
15670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15680 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
15690 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
156a0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
156b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
156c0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
156d0 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
156e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
156f0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
15700 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
15710 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15720 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
15730 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
15740 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
15750 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15760 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
15770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15780 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15790 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
157a0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
157b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
157c0 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 61  ...      if( pFa
157d0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31  rg ){.        r1
157e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
157f0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
15800 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73  Farg);.        s
15810 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15820 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20  ush(pParse);    
15830 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
15840 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
15850 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15860 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
15870 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 31 29  e, pFarg, r1, 1)
15880 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15890 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
158a0 61 72 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54  arse, 1);   /* T
158b0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
158c0 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  be */.      }els
158d0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
158e0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
158f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15900 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
15910 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
15920 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
15930 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
15940 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
15950 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
15960 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
15970 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15980 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
15990 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
159a0 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
159b0 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
159c0 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
159d0 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
159e0 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
159f0 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
15a00 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
15a10 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
15a20 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
15a30 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
15a40 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
15a50 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
15a60 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
15a70 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
15a80 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
15a90 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
15aa0 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
15ab0 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
15ac0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
15ad0 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
15ae0 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
15af0 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
15b00 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
15b10 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
15b20 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
15b30 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
15b40 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
15b50 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
15b60 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
15b70 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
15b80 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
15b90 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
15ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15bb0 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78  nFarg>=2 && (pEx
15bc0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
15bd0 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20  nfixFunc) ){.   
15be0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
15bf0 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
15c00 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
15c10 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
15c20 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
15c30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61     }else if( nFa
15c40 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>0 ){.        
15c50 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
15c60 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
15c70 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
15c80 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rg, pFarg->a[0].
15c90 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
15ca0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
15cb0 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
15cc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
15cd0 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
15ce0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
15cf0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
15d00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
15d10 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c  onstMask |= (1<<
15d20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
15d30 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
15d40 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15d50 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d  FUNC_NEEDCOLL)!=
15d60 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  0 && !pColl ){. 
15d70 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
15d80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
15d90 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72  Seq(pParse, pFar
15da0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  g->a[i].pExpr);.
15db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15dc0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  }.      if( pDef
15dd0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
15de0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
15df0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
15e00 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
15e10 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
15e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15e30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
15e40 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
15e50 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
15e60 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
15e70 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15e80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15e90 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
15ea0 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
15eb0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
15ed0 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
15ee0 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
15ef0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
15f00 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
15f10 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 29       if( nFarg )
15f20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15f30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
15f40 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46  e(pParse, r1, nF
15f50 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
15f60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15f80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
15f90 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
15fa0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
15fb0 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  LECT: {.      te
15fc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
15fd0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
15fe0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15ff0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
16000 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43  inReg = sqlite3C
16010 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
16020 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
16030 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16040 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16050 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
16060 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
16070 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16080 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
16090 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
160a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
160b0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
160c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
160d0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
160e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
160f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
16100 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
16110 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
16120 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
16130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16140 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
16150 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
16160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16170 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
16180 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
16190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
161a0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
161b0 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
161c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
161d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
161e0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
161f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16200 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16210 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
16220 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
16230 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
16240 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
16250 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
16260 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
16270 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
16280 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
16290 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
162a0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
162b0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
162c0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
162d0 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
162e0 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
162f0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
16300 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
16310 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
16320 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
16330 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
16340 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
16350 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
16360 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
16370 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
16380 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  x.pList->a;.    
16390 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
163a0 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
163b0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
163c0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
163d0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
163e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
163f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16400 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16410 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
16420 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
16430 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
16440 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
16450 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
16460 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
16470 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16480 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
16490 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
164a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
164b0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
164c0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
164d0 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
16500 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
16510 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
16520 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
16530 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
16540 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16550 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16560 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
16570 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
16580 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16590 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
165a0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
165b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
165c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
165d0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
165e0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
165f0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
16600 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
16610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16620 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16630 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
16640 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
16650 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16660 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
16670 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
16680 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16690 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
166a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
166b0 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
166c0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
166d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
166e0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
166f0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
16700 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
16710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
16720 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
16730 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
16740 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
16750 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
16760 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
16770 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
16780 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
16790 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
167a0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
167b0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
167c0 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
167d0 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
167e0 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
167f0 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
16800 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
16810 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
16820 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
16830 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
16840 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
16850 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
16860 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
16870 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
16880 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
16890 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
168a0 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
168b0 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
168c0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
168d0 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
168e0 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
168f0 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
16900 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
16910 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
16920 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
16930 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
16940 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
16950 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
16960 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
16970 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
16980 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
16990 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
169a0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
169b0 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
169c0 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
169d0 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
169e0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
169f0 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
16a00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
16a10 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
16a20 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
16a30 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
16a40 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
16a50 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
16a60 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
16a70 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
16a80 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
16a90 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
16aa0 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
16ab0 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
16ac0 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
16ad0 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
16ae0 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
16af0 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
16b00 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
16b10 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
16b20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
16b30 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
16b40 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
16b50 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
16b60 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
16b70 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
16b80 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
16b90 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
16ba0 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
16bb0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
16bc0 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
16bd0 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
16be0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
16bf0 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
16c00 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
16c10 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
16c20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
16c30 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
16c40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
16c50 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
16c60 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
16c70 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
16c80 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
16c90 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
16ca0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
16cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
16cc0 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
16cd0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
16ce0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16cf0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
16d00 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
16d10 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
16d20 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
16d30 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
16d40 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
16d50 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
16d60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16d70 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
16d80 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
16d90 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
16da0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16db0 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
16dc0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
16dd0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
16de0 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20   -> $%d",.      
16df0 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65    (pExpr->iTable
16e00 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22   ? "new" : "old"
16e10 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ),.        (pExp
16e20 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22  r->iColumn<0 ? "
16e30 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e  rowid" : pExpr->
16e40 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
16e50 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65  ->iColumn].zName
16e60 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65  ),.        targe
16e70 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66  t.      ));..#if
16e80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16e90 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
16ea0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16eb0 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20  column has REAL 
16ec0 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79  affinity, it may
16ed0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
16ee0 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20  ored as an.     
16ef0 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65   ** integer. Use
16f00 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
16f10 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
16f20 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e   is really real.
16f30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
16f40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
16f50 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62   .       && pTab
16f60 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
16f70 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
16f80 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
16f90 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
16fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16fb0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
16fc0 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b  finity, target);
16fd0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
16fe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16ff0 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
17000 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a  ** Form A:.    *
17010 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20  *   CASE x WHEN 
17020 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
17030 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
17040 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
17050 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
17060 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a  .    ** Form B:.
17070 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
17080 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
17090 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
170a0 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
170b0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
170c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
170d0 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e  A is can be tran
170e0 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65  sformed into the
170f0 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d   equivalent form
17100 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20   B as follows:. 
17110 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
17120 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57  N x=e1 THEN r1 W
17130 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32  HEN x=e2 THEN r2
17140 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20   ....    **     
17150 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45     WHEN x=eN THE
17160 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
17170 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
17180 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
17190 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  s in pExpr->pLef
171a0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69  t..    ** Y is i
171b0 6e 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e  n pExpr->pRight.
171c0 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
171d0 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
171e0 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a  ere is no.    **
171f0 20 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64   ELSE clause and
17200 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d   no other term m
17210 61 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65  atches, then the
17220 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
17230 20 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20     ** exprssion 
17240 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
17250 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
17260 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
17270 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
17280 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
17290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
172a0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
172b0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
172c0 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
172d0 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
172e0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
172f0 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
17300 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
17310 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
17320 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
17330 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
17340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
17350 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
17360 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
17370 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
17380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17390 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
173a0 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
173b0 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
173c0 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
173f0 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
17400 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
17410 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
17440 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
17450 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17480 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
17490 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
174a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
174b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
174c0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
174d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
174e0 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
174f0 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
17500 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
17510 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
17520 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
17530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
17540 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
17550 0a 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68  .      Expr cach
17560 65 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eX;             
17570 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
17580 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20  ed expression X 
17590 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
175a0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
175b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
175c0 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  e X expression *
175d0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  /.      Expr *pT
175e0 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
175f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d            /* X==
17600 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a  Ei (form A) or j
17610 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20  ust Ei (form B) 
17620 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  */.      VVA_ONL
17630 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76  Y( int iCacheLev
17640 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
17650 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20  cheLevel; )..   
17660 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
17670 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17680 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17690 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
176a0 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  st );.      asse
176b0 72 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt((pExpr->x.pLi
176c0 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d  st->nExpr % 2) =
176d0 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  = 0);.      asse
176e0 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rt(pExpr->x.pLis
176f0 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
17700 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
17710 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
17720 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
17730 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
17740 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
17750 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
17760 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
17770 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17780 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
17790 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
177a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  =0 ){.        ca
177b0 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20  cheX = *pX;.    
177c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
177d0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
177e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
177f0 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
17800 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20  REGISTER );.    
17810 20 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c      cacheX.iTabl
17820 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
17830 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
17840 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
17850 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17860 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
17870 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
17880 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
17890 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
178a0 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a  are.op = TK_EQ;.
178b0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
178c0 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65  e.pLeft = &cache
178d0 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
178e0 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
178f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
17900 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
17910 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
17920 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17930 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
17940 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
17950 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17960 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
17970 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
17980 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
17990 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
179a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
179b0 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
179c0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
179d0 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
179e0 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
179f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17a00 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
17a10 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
17a20 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
17a30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17a40 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
17a50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
17a60 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
17a70 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
17a80 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
17a90 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
17aa0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
17ab0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
17ac0 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
17ad0 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
17ae0 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
17af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17b00 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
17b10 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
17b20 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
17b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
17b50 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
17b60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17b70 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
17b80 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
17b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17ba0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
17bb0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
17bc0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17bd0 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
17be0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17bf0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
17c00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17c10 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
17c20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
17c30 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
17c40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17c50 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
17c60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17c80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
17c90 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
17ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
17cb0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
17cc0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
17cd0 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
17ce0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
17cf0 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
17d00 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
17d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17d20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
17d30 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
17d40 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
17d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17d60 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
17d70 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
17d80 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17d90 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
17da0 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
17db0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
17dc0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
17dd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
17de0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17df0 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
17e00 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
17e10 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
17e20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
17e30 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
17e40 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
17e50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17e60 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
17e90 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
17ea0 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
17eb0 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
17ec0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
17ed0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
17ee0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
17ef0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
17f00 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
17f10 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17f20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
17f30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17f40 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
17f50 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
17f60 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
17f70 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
17f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17f90 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
17fa0 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
17fb0 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
17fc0 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
17fd0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
17fe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17ff0 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
18000 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
18010 65 2c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  e, pExpr->affini
18020 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
18030 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ken, 0);.      }
18040 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
18050 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
18060 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18070 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18080 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
18090 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
180a0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
180b0 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
180c0 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nReg;.}../*.** G
180d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
180e0 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
180f0 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
18100 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
18110 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
18120 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
18130 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
18140 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
18150 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
18160 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
18170 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
18180 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
18190 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
181a0 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
181b0 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
181c0 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
181d0 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
181e0 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
181f0 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
18200 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
18210 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
18220 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
18230 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
18240 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
18250 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  g){.  int r1 = s
18260 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18270 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
18280 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
18290 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
182a0 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
182b0 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
182c0 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
182d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
182e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
182f0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18300 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
18310 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
18320 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18330 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
18340 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
18350 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
18360 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
18370 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
18380 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
18390 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
183a0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
183b0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
183c0 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
183d0 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
183e0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
183f0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
18400 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
18410 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
18420 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
18430 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
18440 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
18450 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
18460 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
18470 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
18480 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
18490 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
184a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
184b0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
184c0 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
184d0 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
184e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
184f0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
18500 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
18510 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  get);.  }.  retu
18520 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a  rn target;.}../*
18530 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
18540 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20  e that evalutes 
18550 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
18560 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
18570 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
18580 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
18590 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
185a0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
185b0 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
185c0 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
185d0 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
185e0 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
185f0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
18600 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
18610 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
18620 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
18630 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
18640 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
18650 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18660 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
18670 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
18680 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
18690 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
186a0 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
186b0 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
186c0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
186d0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
186e0 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   reused..*/.int 
186f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
18700 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
18710 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
18720 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
18730 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
18740 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
18750 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67  t inReg;.  inReg
18760 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18770 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
18780 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
18790 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
187a0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
187b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
187c0 20 74 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54   terms to INSERT
187d0 20 6f 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64   or UPDATE.  And
187e0 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f   the only.  ** o
187f0 74 68 65 72 20 70 6c 61 63 65 20 77 68 65 72 65  ther place where
18800 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
18810 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
18820 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69  to TK_REGISTER i
18830 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20  s.  ** in WHERE 
18840 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
18850 67 2e 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e  g.  So as curren
18860 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  tly implemented,
18870 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e   there is.  ** n
18880 6f 20 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52  o way for a TK_R
18890 45 47 49 53 54 45 52 20 74 6f 20 65 78 69 73 74  EGISTER to exist
188a0 20 68 65 72 65 2e 20 20 42 75 74 20 69 74 20 73   here.  But it s
188b0 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a  eems prudent to.
188c0 20 20 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c    ** keep the AL
188d0 57 41 59 53 28 29 20 69 6e 20 63 61 73 65 20 74  WAYS() in case t
188e0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
188f0 6f 76 65 20 63 68 61 6e 67 65 20 77 69 74 68 20  ove change with 
18900 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69  future.  ** modi
18910 66 69 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68  fications or enh
18920 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  ancements. */.  
18930 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
18940 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
18950 52 29 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20  R) ){  .    int 
18960 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d  iMem;.    iMem =
18970 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18980 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
189a0 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b  y, inReg, iMem);
189b0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
189c0 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70  le = iMem;.    p
189d0 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70  Expr->op2 = pExp
189e0 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72  r->op;.    pExpr
189f0 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
18a00 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
18a10 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
18a20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
18a30 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73  pExpr is an cons
18a40 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
18a50 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
18a60 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f  ate.** for facto
18a70 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
18a80 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  op.  Appropriate
18a90 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
18aa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  :.**.**    *  An
18ab0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  y expression tha
18ac0 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
18ad0 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64  wo or more opcod
18ae0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  es..**.**    *  
18af0 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  Any OP_Integer, 
18b00 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69  OP_Real, OP_Stri
18b10 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f  ng, OP_Blob, OP_
18b20 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20  Null, .**       
18b30 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74  or OP_Variable t
18b40 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
18b50 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
18b60 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70  n a .**       sp
18b70 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e  ecific register.
18b80 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
18b90 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74  no point in fact
18ba0 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65  oring out single
18bb0 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
18bc0 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
18bd0 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74  ions that need t
18be0 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
18bf0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
18c00 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f  ster.  .** We co
18c10 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20  uld factor them 
18c20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65  out, but then we
18c30 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64   would end up ad
18c40 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43  ding an.** OP_SC
18c50 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  opy instruction 
18c60 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
18c70 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  e into the corre
18c80 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c  ct register.** l
18c90 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20  ater.  We might 
18ca0 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65  as well just use
18cb0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
18cc0 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  struction and.**
18cd0 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43   avoid the OP_SC
18ce0 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  opy..*/.static i
18cf0 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  nt isAppropriate
18d00 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70  ForFactoring(Exp
18d10 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71  r *p){.  if( !sq
18d20 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
18d30 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b  antNotJoin(p) ){
18d40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
18d50 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  /* Only constant
18d60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
18d70 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
18d80 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20   factoring */.  
18d90 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
18da0 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74  s & EP_FixedDest
18db0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
18dc0 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f  rn 1;  /* Any co
18dd0 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61  nstant without a
18de0 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
18df0 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  on is appropriat
18e00 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e */.  }.  while
18e10 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
18e20 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74  S ) p = p->pLeft
18e30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
18e40 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
18e50 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
18e60 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
18e70 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20  K_BLOB:.#endif. 
18e80 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
18e90 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  BLE:.    case TK
18ea0 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
18eb0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
18ec0 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
18ed0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
18ee0 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  G: {.      testc
18ef0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42  ase( p->op==TK_B
18f00 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LOB );.      tes
18f10 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
18f20 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20  _VARIABLE );.   
18f30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
18f40 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
18f50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18f60 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  ( p->op==TK_FLOA
18f70 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
18f80 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e  ase( p->op==TK_N
18f90 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
18fa0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
18fb0 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
18fc0 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72   /* Single-instr
18fd0 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  uction constants
18fe0 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65   with a fixed de
18ff0 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20  stination are.  
19000 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f      ** better do
19010 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20  ne in-line.  If 
19020 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20  we factor them, 
19030 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65  they will just e
19040 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67  nd.      ** up g
19050 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f  enerating an OP_
19060 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68  SCopy to move th
19070 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  e value to the d
19080 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
19090 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f   ** register. */
190a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
190b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
190c0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
190d0 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d     if( p->pLeft-
190e0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
190f0 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
19100 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
19110 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
19130 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
19140 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
19150 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
19160 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
19170 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
19180 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
19190 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61  ession that is a
191a0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a  ppropriate for.*
191b0 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20  * factoring out 
191c0 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20  of a loop, then 
191d0 65 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  evaluate the exp
191e0 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20  ression.** into 
191f0 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 63  a register and c
19200 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65  onvert the expre
19210 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f  ssion into a TK_
19220 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72  REGISTER.** expr
19230 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
19240 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45  c int evalConstE
19250 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  xpr(Walker *pWal
19260 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
19270 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
19280 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
19290 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20  arse;.  switch( 
192a0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
192b0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
192c0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
192d0 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
192e0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
192f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
19300 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
19310 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
19320 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
19330 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20  ONST_FUNC: {.   
19340 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
19350 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  nts to a functio
19360 6e 20 68 61 76 65 20 61 20 66 69 78 65 64 20 64  n have a fixed d
19370 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20  estination..    
19380 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74    ** Mark them t
19390 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64  his way to avoid
193a0 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65   generated unnee
193b0 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20  ded OP_SCopy.   
193c0 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
193d0 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ns. .      */.  
193e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
193f0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
19400 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  List;.      asse
19410 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
19420 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
19430 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
19440 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
19450 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
19460 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
19470 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
19480 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
19490 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  m = pList->a;.  
194a0 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b        for(; i>0;
194b0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
194c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 41 4c            if( AL
194d0 57 41 59 53 28 70 49 74 65 6d 2d 3e 70 45 78 70  WAYS(pItem->pExp
194e0 72 29 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70  r) ) pItem->pExp
194f0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  r->flags |= EP_F
19500 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20  ixedDest;.      
19510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19530 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f   }.  if( isAppro
19540 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69  priateForFactori
19550 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ng(pExpr) ){.   
19560 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72   int r1 = ++pPar
19570 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  se->nMem;.    in
19580 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73  t r2;.    r2 = s
19590 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
195a0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
195b0 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
195c0 20 4e 45 56 45 52 28 72 31 21 3d 72 32 29 20 29   NEVER(r1!=r2) )
195d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
195e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
195f0 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  1);.    pExpr->o
19600 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  p2 = pExpr->op;.
19610 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
19620 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
19630 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
19640 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   r2;.    return 
19650 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
19660 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
19670 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  inue;.}../*.** P
19680 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74  reevaluate const
19690 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  ant subexpressio
196a0 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20  ns within pExpr 
196b0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
196c0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
196d0 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70  sters.  Modify p
196e0 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65  Expr so that the
196f0 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
19700 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54  resions.** are T
19710 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64  K_REGISTER opcod
19720 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
19730 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64   the precomputed
19740 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64   values..*/.void
19750 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19760 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
19770 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
19780 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
19790 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
197a0 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74  back = evalConst
197b0 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Expr;.  w.xSelec
197c0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
197d0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
197e0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
197f0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
19800 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
19810 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
19820 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
19830 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
19840 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
19850 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
19860 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
19870 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
19880 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
19890 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
198a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
198b0 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
198c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
198d0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
198e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
198f0 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
19900 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
19910 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
19920 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
19930 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
19940 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
19950 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
19960 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
19970 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
19980 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f  doHardCopy     /
19990 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f  * Make a hard co
199a0 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  py of every elem
199b0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ent */.){.  stru
199c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
199d0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
199e0 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
199f0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
19a00 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
19a10 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
19a20 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
19a30 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
19a40 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
19a50 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
19a60 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->iAlias ){.   
19a70 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f     int iReg = co
19a80 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
19a90 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70  pItem->iAlias, p
19aa0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72  Item->pExpr, tar
19ab0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  get+i);.      Vd
19ac0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
19ad0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
19ae0 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
19af0 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
19b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19b10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
19b20 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b  y, iReg, target+
19b30 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
19b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
19b50 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
19b60 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
19b70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
19b80 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61    }.    if( doHa
19b90 72 64 43 6f 70 79 20 26 26 20 21 70 50 61 72 73  rdCopy && !pPars
19ba0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
19bb0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
19bc0 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79  ite3ExprHardCopy
19bd0 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c  (pParse, target,
19be0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   n);.    }.  }. 
19bf0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
19c00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19c10 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
19c20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
19c30 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
19c40 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
19c50 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
19c60 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
19c70 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
19c80 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
19c90 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
19ca0 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
19cb0 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
19cc0 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20  ** elementation 
19cd0 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
19ce0 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
19cf0 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
19d00 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
19d10 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
19d20 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
19d30 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
19d40 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
19d50 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
19d60 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
19d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
19d80 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
19d90 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
19da0 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
19db0 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
19dc0 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
19dd0 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
19de0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
19df0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
19e00 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
19e10 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
19e20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
19e30 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
19e40 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
19e50 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
19e60 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
19e70 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
19e80 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
19e90 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
19ea0 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
19eb0 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
19ec0 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
19ed0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
19ee0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
19ef0 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
19f00 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
19f10 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
19f20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19f30 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
19f40 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
19f50 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
19f60 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
19f70 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
19f80 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
19f90 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
19fa0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
19fb0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
19fc0 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
19fd0 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
19fe0 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
19ff0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1a000 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1a010 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1a020 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1a030 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1a040 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1a050 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1a060 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1a070 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 58  ].pExpr;.  exprX
1a080 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
1a090 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a0a0 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
1a0b0 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78 70 72  egFree1);.  expr
1a0c0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
1a0d0 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66  ER;.  if( jumpIf
1a0e0 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  True ){.    sqli
1a0f0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1a100 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1a110 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1a120 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a130 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1a140 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  se(pParse, &expr
1a150 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
1a160 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
1a170 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a180 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1a190 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
1a1a0 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
1a1b0 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
1a1c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a1d0 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1a1e0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1a1f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1a200 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1a210 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1a220 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1a230 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1a240 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1a250 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1a260 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1a270 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1a280 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1a290 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1a2a0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1a2b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1a2c0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1a2d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1a2e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1a2f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1a300 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1a310 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1a320 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1a330 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1a340 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1a350 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1a360 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1a370 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1a380 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1a390 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1a3a0 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
1a3b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1a3c0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1a3d0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1a3e0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1a3f0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1a400 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1a410 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
1a420 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1a430 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1a440 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1a450 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1a460 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
1a470 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1a480 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1a490 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1a4a0 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
1a4b0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
1a4c0 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
1a4d0 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
1a4e0 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
1a4f0 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
1a500 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
1a510 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
1a520 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
1a530 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
1a540 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
1a550 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
1a560 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
1a570 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
1a580 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
1a590 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
1a5a0 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
1a5b0 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
1a5c0 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
1a5d0 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
1a5e0 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
1a5f0 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
1a600 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
1a610 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
1a620 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
1a630 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
1a640 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
1a650 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1a660 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
1a670 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1a680 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
1a690 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
1a6a0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1a6b0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1a6c0 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
1a6d0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
1a6e0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
1a6f0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
1a700 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
1a710 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
1a720 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
1a730 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
1a740 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
1a750 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
1a760 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45  xistance of VDBE
1a770 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1a780 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
1a790 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
1a7a0 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
1a7b0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
1a7c0 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
1a7d0 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
1a7e0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1a7f0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
1a800 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
1a810 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1a820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a830 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1a840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a850 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1a860 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1a870 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1a880 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1a890 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
1a8a0 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1a8b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1a8c0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1a8d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1a8e0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1a8f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1a900 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a910 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1a920 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a930 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1a940 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1a950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a960 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1a970 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a980 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1a990 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1a9a0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1a9b0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1a9c0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1a9d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1a9e0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1a9f0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1aa00 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1aa10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1aa20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1aa30 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1aa40 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1aa50 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1aa60 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1aa70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1aa80 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1aa90 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1aaa0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1aab0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1aac0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1aad0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1aae0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1aaf0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1ab00 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1ab10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1ab20 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
1ab30 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
1ab40 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
1ab50 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
1ab60 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
1ab70 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
1ab80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ab90 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
1aba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1abb0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
1abc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1abd0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1abe0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1abf0 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1ac00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ac10 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1ac20 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1ac30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ac40 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1ac50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ac60 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1ac70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1ac80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ac90 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1aca0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1acb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1acc0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1acd0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1ace0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1acf0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1ad00 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1ad10 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1ad20 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1ad30 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1ad40 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1ad60 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1ad70 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1ad80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ad90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1ada0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1adb0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1adc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1add0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1ade0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1adf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ae00 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1ae10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ae20 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1ae30 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ae40 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ae50 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ae60 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ae70 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1ae80 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ae90 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1aea0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1aeb0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1aec0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1aed0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
1aee0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1aef0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1af00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1af10 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1af20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1af30 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1af40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1af50 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1af60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1af70 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1af80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1af90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1afa0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1afb0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1afc0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1afd0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1afe0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
1aff0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1b000 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
1b010 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1b020 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1b030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1b040 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1b050 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1b060 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1b070 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1b080 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1b090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b0a0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1b0b0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
1b0c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1b0d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1b0e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b0f0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1b100 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1b110 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1b120 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1b130 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1b140 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1b150 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  1, jumpIfNull);.
1b160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b170 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1b180 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
1b190 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
1b1a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1b1b0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
1b1c0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d  destIfNull = jum
1b1d0 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
1b1e0 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
1b1f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b200 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1b210 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
1b220 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
1b230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1b250 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
1b260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1b270 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1b280 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1b290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b2a0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1b2b0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1b2c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1b2d0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1b2e0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1b2f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b300 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
1b310 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
1b320 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  0);.      testca
1b330 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1b340 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b350 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1b360 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1b370 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1b380 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1b390 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1b3a0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
1b3b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b3c0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
1b3d0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
1b3e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1b3f0 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1b400 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1b410 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1b420 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1b430 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1b440 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
1b450 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1b460 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1b470 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1b480 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
1b490 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1b4a0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1b4b0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1b4c0 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1b4d0 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
1b4e0 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
1b4f0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1b500 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
1b510 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
1b520 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
1b530 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1b540 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
1b550 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1b560 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1b570 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1b580 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b590 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1b5a0 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1b5b0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1b5c0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1b5d0 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1b5e0 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1b5f0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1b600 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1b610 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1b620 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
1b630 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e  turn; /* Existan
1b640 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1b650 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1b660 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1b670 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
1b680 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
1b690 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
1b6a0 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
1b6b0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1b6c0 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
1b6d0 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
1b6e0 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
1b6f0 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
1b700 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
1b710 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
1b720 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
1b730 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1b740 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
1b750 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
1b760 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
1b770 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
1b780 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
1b790 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
1b7a0 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1b7b0 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
1b7c0 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
1b7d0 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
1b7e0 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
1b7f0 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
1b800 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
1b810 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
1b820 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1b830 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
1b840 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
1b850 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
1b860 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
1b870 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
1b880 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
1b890 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
1b8a0 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
1b8b0 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
1b8c0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
1b8d0 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
1b8e0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1b8f0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
1b900 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
1b910 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
1b920 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
1b930 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
1b940 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
1b950 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
1b960 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
1b970 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
1b980 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
1b990 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1b9a0 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1b9b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1b9c0 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
1b9d0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
1b9e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1b9f0 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
1ba00 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
1ba10 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ba20 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
1ba30 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
1ba40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1ba50 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
1ba60 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
1ba70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1ba80 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
1ba90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1baa0 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
1bab0 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
1bac0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1bad0 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
1bae0 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
1baf0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1bb00 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
1bb10 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
1bb20 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1bb30 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
1bb40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1bb50 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1bb60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bb70 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1bb80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1bb90 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1bba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bbb0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1bbc0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1bbd0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1bbe0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1bbf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bc00 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
1bc10 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
1bc20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1bc30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bc40 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1bc50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bc60 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1bc70 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1bc80 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1bc90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1bca0 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
1bcb0 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1bcc0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1bcd0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1bce0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bcf0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1bd00 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1bd10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1bd20 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
1bd30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bd40 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1bd50 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
1bd60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bd70 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1bd80 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1bd90 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1bda0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1bdb0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1bdc0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1bdd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1bde0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bdf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1be00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1be10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1be20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1be30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1be40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1be50 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1be60 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
1be70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1be80 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
1be90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1bea0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
1beb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1bec0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
1bed0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
1bee0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bef0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
1bf00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bf10 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1bf20 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1bf30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1bf40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1bf50 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1bf60 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1bf70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1bf80 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1bf90 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1bfa0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
1bfb0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1bfc0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1bfd0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bff0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1c000 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1c010 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1c020 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1c030 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1c040 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1c050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c060 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1c070 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1c080 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1c090 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1c0a0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1c0b0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1c0c0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1c0d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1c0e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c0f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1c100 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1c110 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1c120 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c130 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1c140 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1c150 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
1c160 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
1c170 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
1c180 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1c190 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1c1a0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1c1b0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1c1d0 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1c1e0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1c1f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1c200 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1c210 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1c220 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1c230 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c240 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1c250 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1c260 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ULL: {.      tes
1c270 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1c280 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
1c290 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1c2a0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1c2b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1c2c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1c2d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1c2e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1c2f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c300 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
1c310 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
1c320 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1c330 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1c340 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c350 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1c360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1c370 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1c380 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1c390 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1c3a0 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d  pr, dest, 0, jum
1c3b0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1c3c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c3d0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1c3e0 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
1c3f0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
1c400 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1c410 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c420 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
1c430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c440 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
1c450 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1c460 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1c470 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c480 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1c490 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
1c4a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
1c4b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1c4c0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1c4d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
1c4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c4f0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
1c500 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
1c510 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c520 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c530 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1c540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c550 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
1c560 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
1c570 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
1c580 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1c590 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1c5a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1c5b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1c5c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c5d0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1c5e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1c5f0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1c600 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c610 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1c620 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
1c630 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
1c640 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
1c650 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
1c660 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
1c670 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
1c680 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
1c690 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
1c6a0 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
1c6b0 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
1c6c0 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
1c6d0 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
1c6e0 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
1c6f0 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
1c700 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
1c710 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
1c720 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
1c730 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  rator..**.** Som
1c740 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
1c750 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1c760 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
1c770 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
1c780 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
1c790 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
1c7a0 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
1c7b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1c7c0 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
1c7d0 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
1c7e0 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
1c7f0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
1c800 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
1c810 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
1c820 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
1c830 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
1c840 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1c850 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1c860 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
1c870 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
1c880 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
1c890 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
1c8a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
1c8b0 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
1c8c0 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
1c8d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c8e0 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
1c8f0 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
1c900 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
1c910 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
1c920 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
1c930 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
1c940 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
1c950 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
1c960 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
1c970 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
1c980 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1c990 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1c9a0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
1c9b0 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41 3d 3d  *pB){.  if( pA==
1c9c0 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
1c9d0 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
1c9e0 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 2;.  }.  ass
1c9f0 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1ca00 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1ca10 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1ca20 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72  uced) );.  asser
1ca30 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1ca40 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f  operty(pB, EP_To
1ca50 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1ca60 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70  ed) );.  if( Exp
1ca70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
1ca80 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c   EP_xIsSelect) |
1ca90 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
1caa0 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pB, EP_xIsSele
1cab0 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
1cac0 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 2;.  }.  if( (
1cad0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
1cae0 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
1caf0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
1cb00 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
1cb10 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
1cb20 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 32 3b  ->op ) return 2;
1cb30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1cb40 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1cb50 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
1cb60 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1cb70 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1cb80 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1cb90 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1cba0 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1cbb0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1cbc0 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
1cbd0 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 29 20  t, pB->x.pList) 
1cbe0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1cbf0 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
1cc00 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
1cc10 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
1cc20 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
1cc30 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1cc40 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e  operty(pA, EP_In
1cc50 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69  tValue) ){.    i
1cc60 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1cc70 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1cc80 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56  lue) || pA->u.iV
1cc90 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue!=pB->u.iVal
1cca0 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
1ccb0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 2;.    }.  }e
1ccc0 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  lse if( pA->op!=
1ccd0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
1cce0 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
1ccf0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1cd00 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56  erty(pB, EP_IntV
1cd10 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70  alue) || NEVER(p
1cd20 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20  B->u.zToken==0) 
1cd30 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
1cd40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1cd50 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
1cd60 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
1cd70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1cd80 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
1cd90 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
1cda0 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21   EP_ExpCollate)!
1cdb0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
1cdc0 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 20 72  _ExpCollate) ) r
1cdd0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 28  eturn 1;.  if( (
1cde0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pA->flags & EP_E
1cdf0 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20 26 26  xpCollate)!=0 &&
1ce00 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d 3e   pA->pColl!=pB->
1ce10 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20 32  pColl ) return 2
1ce20 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1ce30 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1ce40 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
1ce50 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
1ce60 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
1ce70 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
1ce80 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
1ce90 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
1cea0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ceb0 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
1cec0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
1ced0 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
1cee0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
1cef0 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
1cf00 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
1cf10 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
1cf20 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
1cf30 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
1cf40 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
1cf50 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
1cf60 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
1cf70 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
1cf80 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1cf90 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1cfa0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
1cfb0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
1cfc0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
1cfd0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
1cfe0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
1cff0 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
1d000 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1d010 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1d020 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
1d030 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
1d040 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1d050 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
1d060 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1d070 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
1d080 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1d090 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
1d0a0 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
1d0b0 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
1d0c0 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
1d0d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1d0e0 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
1d0f0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
1d100 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
1d110 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1d120 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72   pA->a[i].sortOr
1d130 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  der!=pB->a[i].so
1d140 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
1d150 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
1d160 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1d170 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20 29  ExprA, pExprB) )
1d180 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1d190 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1d1a0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
1d1b0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
1d1c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
1d1d0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
1d1e0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1d1f0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
1d200 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1d210 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
1d220 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
1d230 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
1d240 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
1d250 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
1d260 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
1d270 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
1d280 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1d290 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
1d2a0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
1d2b0 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
1d2c0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
1d2d0 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
1d2e0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
1d2f0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  umn,.       &pIn
1d300 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63  fo->nColumnAlloc
1d310 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
1d320 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
1d330 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
1d340 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1d350 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
1d360 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
1d370 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1d380 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
1d390 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
1d3a0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
1d3b0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
1d3c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
1d3d0 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
1d3e0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
1d3f0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
1d400 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
1d410 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
1d420 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1d430 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
1d440 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
1d450 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
1d460 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
1d470 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
1d480 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
1d490 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
1d4a0 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
1d4b0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
1d4c0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
1d4d0 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
1d4e0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
1d4f0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
1d500 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
1d510 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
1d520 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1d530 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
1d540 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1d550 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
1d560 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1d570 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
1d580 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
1d590 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
1d5a0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
1d5b0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
1d5c0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
1d5d0 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
1d5e0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
1d5f0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
1d600 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
1d610 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
1d620 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
1d630 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
1d640 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
1d650 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1d660 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1d670 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
1d680 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1d690 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1d6a0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1d6b0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
1d6c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d6d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1d6e0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
1d6f0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1d700 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
1d710 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
1d720 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
1d730 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
1d740 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
1d750 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
1d760 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
1d770 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
1d780 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1d790 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1d7a0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
1d7b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1d7c0 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
1d7d0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1d7e0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1d7f0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1d800 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
1d810 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1d820 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d830 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1d840 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
1d850 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1d860 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
1d870 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
1d880 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1d890 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1d8a0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1d8b0 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
1d8c0 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
1d8d0 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
1d8e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1d8f0 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
1d900 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
1d910 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1d920 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
1d930 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
1d940 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
1d950 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
1d960 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
1d970 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
1d980 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
1d990 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1d9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1d9b0 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
1d9c0 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
1d9d0 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
1d9e0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
1d9f0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
1da00 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1da20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
1da30 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da50 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
1da60 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
1da70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1da80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1da90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1daa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dab0 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
1dac0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1dae0 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
1daf0 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
1db00 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
1db10 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1db30 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1db40 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
1db50 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
1db60 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1db80 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
1db90 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1dba0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1dbb0 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
1dbc0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1dbd0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
1dbe0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1dbf0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
1dc00 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
1dc10 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
1dc20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1dc30 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1dc50 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
1dc60 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
1dc70 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
1dc80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dc90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
1dca0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
1dcb0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
1dcc0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1dcd0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
1dce0 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1dd00 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1dd20 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
1dd30 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1dd40 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1dd50 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
1dd60 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1dd70 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1dd80 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1dd90 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
1dda0 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
1ddd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
1dde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ddf0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1de00 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1de30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1de70 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1de80 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1de90 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1dea0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
1deb0 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
1dec0 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
1ded0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1def0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
1df00 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
1df10 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
1df20 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
1df30 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
1df40 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
1df50 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
1df60 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
1df70 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
1df80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
1df90 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
1dfa0 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
1dfb0 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
1dfc0 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
1dfd0 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
1dfe0 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
1e000 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
1e010 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
1e020 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1e030 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
1e040 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
1e050 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e060 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
1e070 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
1e080 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
1e090 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
1e0a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e0b0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
1e0c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
1e0d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
1e0e0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
1e0f0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
1e100 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
1e110 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1e120 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
1e130 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1e140 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  CTION: {.      /
1e150 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74  * The pNC->nDept
1e160 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73  h==0 test causes
1e170 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1e180 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69  ions in subqueri
1e190 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  es.      ** to b
1e1a0 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20  e ignored */.   
1e1b0 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70     if( pNC->nDep
1e1c0 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  th==0 ){.       
1e1d0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1e1e0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
1e1f0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
1e200 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
1e210 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
1e220 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
1e230 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
1e240 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
1e250 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e260 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1e270 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
1e280 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
1e290 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1e2a0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1e2b0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1e2c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
1e2d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1e2e0 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
1e2f0 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pExpr)==0 ){.   
1e300 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1e310 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1e330 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
1e340 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1e350 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
1e360 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
1e370 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
1e380 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
1e390 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1e3a0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
1e3b0 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
1e3c0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
1e3d0 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
1e3e0 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
1e3f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
1e400 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
1e410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e420 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e430 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1e440 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
1e450 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
1e460 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
1e470 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1e480 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
1e490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1e4a0 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
1e4b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1e4c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e4d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e4e0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e4f0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1e500 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
1e510 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1e520 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
1e530 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1e540 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
1e550 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74  Token, sqlite3St
1e560 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
1e570 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20  zToken),.       
1e580 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1e590 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
1e5a0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1e5b0 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
1e5c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e5d0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
1e5e0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1e600 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1e610 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1e620 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1e630 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1e640 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
1e650 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
1e660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e670 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e680 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
1e690 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
1e6a0 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
1e6b0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
1e6c0 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
1e6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e6e0 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1e6f0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1e700 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1e710 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
1e720 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
1e730 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1e740 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
1e750 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
1e760 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
1e770 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1e780 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1e790 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
1e7a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1e7b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
1e7c0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1e7d0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1e7e0 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
1e7f0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
1e800 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  lect){.  NameCon
1e810 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
1e820 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66  ker->u.pNC;.  if
1e830 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
1e840 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
1e850 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  pth++;.    sqlit
1e860 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1e870 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
1e880 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
1e890 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  -;.    return WR
1e8a0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65  C_Prune;.  }else
1e8b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1e8c0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
1e8d0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1e8e0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1e8f0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1e900 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1e910 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1e920 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1e930 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1e940 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1e950 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1e960 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1e970 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1e980 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1e990 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1e9a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e9b0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1e9c0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1e9d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e9e0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1e9f0 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
1ea00 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
1ea10 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1ea20 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1ea30 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1ea40 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1ea50 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
1ea60 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
1ea70 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
1ea80 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
1ea90 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1eaa0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1eab0 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
1eac0 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
1ead0 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
1eae0 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
1eaf0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
1eb00 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
1eb10 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
1eb20 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1eb30 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
1eb40 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
1eb50 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
1eb60 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
1eb70 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1eb80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1eb90 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
1eba0 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
1ebb0 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
1ebc0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1ebd0 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
1ebe0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
1ebf0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
1ec00 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1ec10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1ec20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ec30 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
1ec40 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1ec50 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1ec60 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
1ec70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1ec80 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1ec90 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
1eca0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
1ecb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
1ecc0 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
1ecd0 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
1ece0 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
1ecf0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
1ed00 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
1ed10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
1ed20 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1ed30 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1ed40 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
1ed50 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
1ed60 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
1ed70 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
1ed80 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
1ed90 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
1eda0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
1edb0 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
1edc0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
1edd0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
1ede0 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
1edf0 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
1ee00 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
1ee10 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
1ee20 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
1ee30 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c  then.** the dall
1ee40 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
1ee50 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
1ee60 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
1ee70 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
1ee80 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
1ee90 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
1eea0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1eeb0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
1eec0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
1eed0 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
1eee0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
1eef0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
1ef00 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
1ef10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
1ef20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1ef30 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
1ef40 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1ef50 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1ef60 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1ef70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1ef80 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
1ef90 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
1efa0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
1efb0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1efc0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1efd0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1efe0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1eff0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
1f000 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
1f010 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
1f020 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
1f030 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
1f040 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1f050 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
1f060 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
1f070 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
1f080 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
1f090 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
1f0a0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1f0b0 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
1f0c0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
1f0d0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
1f0e0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
1f0f0 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61  +n-1) );.    pPa
1f100 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
1f110 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1f120 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
1f130 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
1f140 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
1f150 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1f160 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1f170 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1f180 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1f190 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1f1a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f1b0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1f1c0 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg){.  sqlite3Ex
1f1d0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1f1e0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
1f1f0 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
1f200 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1f210 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
1f220 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
1f230 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
1f240 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
1f250 20 7d 0a 7d 0a                                    }.}.