/ Hex Artifact Content
Login

Artifact f14ffa54e4eea3909b1ac8d5f6d25fe053611804:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0760: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0770: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0780: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0790: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
07a0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
07b0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
07c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
07d0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
07e0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
07f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0800: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0810: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0820: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0830: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0840: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0850: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0860: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0870: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
0880: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0890: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 50 61  e3ExprSetColl(Pa
08a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
08b0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
08c0: 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20 20 63  *pCollName){.  c
08d0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 20  har *zColl = 0; 
08e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
08f0: 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63  quoted name of c
0900: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0910: 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
0920: 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 33  pColl;.  sqlite3
0930: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0940: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
0950: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
0960: 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d 65 29  n(db, pCollName)
0970: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
0980: 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43   zColl ){.    pC
0990: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
09a0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
09b0: 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  e, zColl);.    i
09c0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
09d0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
09e0: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45   pColl;.      pE
09f0: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
0a00: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
0a10: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
0a20: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
0a30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  );.  return pExp
0a40: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0a50: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
0a60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0a70: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0a80: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0a90: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0aa0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
0ab0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
0ac0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
0ad0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
0ae0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0af0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
0b00: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0b10: 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45  ;.  Expr *p = pE
0b20: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  xpr;.  while( AL
0b30: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 69  WAYS(p) ){.    i
0b40: 6e 74 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c  nt op;.    pColl
0b50: 20 3d 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20   = p->pColl;.   
0b60: 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65   if( pColl ) bre
0b70: 61 6b 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e  ak;.    op = p->
0b80: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  op;.    if( p->p
0b90: 54 61 62 21 3d 30 20 26 26 20 28 0a 20 20 20 20  Tab!=0 && (.    
0ba0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43      op==TK_AGG_C
0bb0: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0bc0: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0bd0: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
0be0: 3d 54 4b 5f 54 52 49 47 47 45 52 0a 20 20 20 20  =TK_TRIGGER.    
0bf0: 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d  )){.      /* op=
0c00: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
0c10: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
0c20: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0c30: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0c40: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0c50: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0c60: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0c70: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0c80: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
0c90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0ca0: 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  ll;.      int j 
0cb0: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
0cc0: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
0cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
0ce0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0cf0: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ;.        zColl 
0d00: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
0d10: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
0d20: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
0d30: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
0d40: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
0d50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78   0);.        pEx
0d60: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pr->pColl = pCol
0d70: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
0d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0d90: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53    if( op!=TK_CAS
0da0: 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55  T && op!=TK_UPLU
0db0: 53 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  S ){.      break
0dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
0dd0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  p->pLeft;.  }.  
0de0: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
0df0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0e00: 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70  pColl) ){ .    p
0e10: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
0e20: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
0e30: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
0e40: 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  an operand of a 
0e50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0e60: 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68  tor.  aff2 is th
0e70: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
0e80: 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ty of the other 
0e90: 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
0ea0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
0eb0: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0ec0: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
0ed0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
0ee0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0ef0: 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  tor..*/.char sql
0f00: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0f10: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ity(Expr *pExpr,
0f20: 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63   char aff2){.  c
0f30: 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74  har aff1 = sqlit
0f40: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0f50: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66  Expr);.  if( aff
0f60: 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20  1 && aff2 ){.   
0f70: 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f   /* Both sides o
0f80: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0f90: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66   are columns. If
0fa0: 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63   one has numeric
0fb0: 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79  .    ** affinity
0fc0: 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65  , use that. Othe
0fd0: 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66  rwise use no aff
0fe0: 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  inity..    */.  
0ff0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e    if( sqlite3IsN
1000: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61  umericAffinity(a
1010: 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49  ff1) || sqlite3I
1020: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1030: 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20  (aff2) ){.      
1040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
1050: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
1060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1070: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1080: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  NE;.    }.  }els
1090: 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21  e if( !aff1 && !
10a0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  aff2 ){.    /* N
10b0: 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
10c0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
10d0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70   a column.  Comp
10e0: 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  are the.    ** r
10f0: 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e  esults directly.
1100: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
1110: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1120: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1130: 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20   /* One side is 
1140: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74  a column, the ot
1150: 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20  her is not. Use 
1160: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  the columns affi
1170: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  nity. */.    ass
1180: 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20  ert( aff1==0 || 
1190: 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72  aff2==0 );.    r
11a0: 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66  eturn (aff1 + af
11b0: 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  f2);.  }.}../*.*
11c0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
11d0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
11e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  .  Return the ty
11f0: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1200: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70   should.** be ap
1210: 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70  plied to both op
1220: 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20  erands prior to 
1230: 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  doing the compar
1240: 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ison..*/.static 
1250: 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41  char comparisonA
1260: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
1270: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
1280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1290: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
12a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
12b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
12c0: 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20  K_LT ||.        
12d0: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
12e0: 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GT || pExpr->op=
12f0: 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_GE || pExpr-
1300: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20  >op==TK_LE ||.  
1310: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1320: 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70  p==TK_NE || pExp
1330: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
1340: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1350: 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NOT );.  assert(
1360: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
1370: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1380: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1390: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
13a0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
13b0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
13c0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13d0: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
13e0: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  t, aff);.  }else
13f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1400: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1410: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1420: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
1430: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1440: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
1450: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1460: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73  pr, aff);.  }els
1470: 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20  e if( !aff ){.  
1480: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
1490: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72  FF_NONE;.  }.  r
14a0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
14b0: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
14c0: 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73  omparison expres
14d0: 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27  sion, eg. '=', '
14e0: 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e  <', IN(...) etc.
14f0: 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79  .** idx_affinity
1500: 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   is the affinity
1510: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
1520: 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72  olumn. Return tr
1530: 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64  ue.** if the ind
1540: 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79  ex with affinity
1550: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61   idx_affinity ma
1560: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  y be used to imp
1570: 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f  lement.** the co
1580: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70  mparison in pExp
1590: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
15a0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
15b0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
15c0: 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ar idx_affinity)
15d0: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63  {.  char aff = c
15e0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
15f0: 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74  y(pExpr);.  swit
1600: 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63  ch( aff ){.    c
1610: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1620: 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ONE:.      retur
1630: 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51  n 1;.    case SQ
1640: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
1650: 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f       return idx_
1660: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1670: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64  _AFF_TEXT;.    d
1680: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1690: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75  turn sqlite3IsNu
16a0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
16b0: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d  x_affinity);.  }
16c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16d0: 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68   the P5 value th
16e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
16f0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
1700: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
1710: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1720: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1730: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1740: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74  nd pExpr2..*/.st
1750: 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f  atic u8 binaryCo
1760: 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45  mpareP5(Expr *pE
1770: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
1780: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
1790: 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20  ll){.  u8 aff = 
17a0: 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70  (char)sqlite3Exp
17b0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
17c0: 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73  );.  aff = (u8)s
17d0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
17e0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
17f0: 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e  f) | (u8)jumpIfN
1800: 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66  ull;.  return af
1810: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  f;.}../*.** Retu
1820: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1830: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1840: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1850: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1860: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1870: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1880: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1890: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
18a0: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
18b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
18c0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18d0: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
18e0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
18f0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
1900: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1910: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
1920: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
1930: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1940: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1950: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1960: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1970: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1980: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
1990: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
19a0: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
19b0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
19c0: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
19d0: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
19e0: 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  red..*/.CollSeq 
19f0: 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f  *sqlite3BinaryCo
1a00: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
1a10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
1a20: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a    Expr *pLeft, .
1a30: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
1a40: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1a50: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ll;.  assert( pL
1a60: 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  eft );.  if( pLe
1a70: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
1a80: 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
1a90: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
1aa0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f  pColl );.    pCo
1ab0: 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ll = pLeft->pCol
1ac0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
1ad0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
1ae0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1af0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b00: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43  sert( pRight->pC
1b10: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1b20: 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c   = pRight->pColl
1b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1b50: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1b60: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
1b70: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1b80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1b90: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1ba0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
1bb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bc0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1bd0: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70   Generate the op
1be0: 65 72 61 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d  erands for a com
1bf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
1c00: 6e 2e 20 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65  n.  Before.** ge
1c10: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
1c20: 65 20 66 6f 72 20 65 61 63 68 20 6f 70 65 72 61  e for each opera
1c30: 6e 64 2c 20 73 65 74 20 74 68 65 20 45 50 5f 41  nd, set the EP_A
1c40: 6e 79 41 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e  nyAff.** flag on
1c50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c60: 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1c70: 62 65 20 61 62 6c 65 20 74 6f 20 75 73 65 64 20  be able to used 
1c80: 61 0a 2a 2a 20 63 61 63 68 65 64 20 63 6f 6c 75  a.** cached colu
1c90: 6d 6e 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  mn value that ha
1ca0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 64  s previously und
1cb0: 65 72 67 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66  ergone an.** aff
1cc0: 69 6e 69 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f  inity change..*/
1cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1ce0: 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
1cf0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d00: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1d10: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1d20: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1d30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
1d40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1d50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1d60: 20 2a 70 52 65 67 4c 65 66 74 2c 20 20 20 20 2f   *pRegLeft,    /
1d70: 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72 65  * Register where
1d80: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 69 73   left operand is
1d90: 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74   stored */.  int
1da0: 20 2a 70 46 72 65 65 4c 65 66 74 2c 20 20 20 2f   *pFreeLeft,   /
1db0: 2a 20 46 72 65 65 20 74 68 69 73 20 72 65 67 69  * Free this regi
1dc0: 73 74 65 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a  ster when done *
1dd0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
1de0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
1df0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
1e00: 69 6e 74 20 2a 70 52 65 67 52 69 67 68 74 2c 20  int *pRegRight, 
1e10: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 77 68    /* Register wh
1e20: 65 72 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  ere right operan
1e30: 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20  d is stored */. 
1e40: 20 69 6e 74 20 2a 70 46 72 65 65 52 69 67 68 74   int *pFreeRight
1e50: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 65 6d 70     /* Write temp
1e60: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 69   register for ri
1e70: 67 68 74 20 6f 70 65 72 61 6e 64 20 74 68 65 72  ght operand ther
1e80: 65 20 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28  e */.){.  while(
1e90: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55   pLeft->op==TK_U
1ea0: 50 4c 55 53 20 29 20 70 4c 65 66 74 20 3d 20 70  PLUS ) pLeft = p
1eb0: 4c 65 66 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70  Left->pLeft;.  p
1ec0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
1ed0: 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65  P_AnyAff;.  *pRe
1ee0: 67 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  gLeft = sqlite3E
1ef0: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f00: 73 65 2c 20 70 4c 65 66 74 2c 20 70 46 72 65 65  se, pLeft, pFree
1f10: 4c 65 66 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  Left);.  while( 
1f20: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55  pRight->op==TK_U
1f30: 50 4c 55 53 20 29 20 70 52 69 67 68 74 20 3d 20  PLUS ) pRight = 
1f40: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20  pRight->pLeft;. 
1f50: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c   pRight->flags |
1f60: 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a  = EP_AnyAff;.  *
1f70: 70 52 65 67 52 69 67 68 74 20 3d 20 73 71 6c 69  pRegRight = sqli
1f80: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f90: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1fa0: 70 46 72 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a  pFreeRight);.}..
1fb0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1fc0: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1fd0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1fe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1ff0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
2000: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
2010: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
2020: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
2030: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2040: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2050: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2060: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2070: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2080: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2090: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
20a0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
20b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
20c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
20d0: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
20e0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
20f0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
2100: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
2110: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
2120: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
2130: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2140: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2150: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2160: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2170: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2180: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2190: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
21a0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
21b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
21c0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
21d0: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
21e0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
21f0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
2200: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2210: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
2220: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
2230: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2260: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2270: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2280: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2290: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
22a0: 29 3b 0a 20 20 69 66 28 20 28 70 35 20 26 20 53  );.  if( (p5 & S
22b0: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 29 21  QLITE_AFF_MASK)!
22c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
22d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
22e0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
22f0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
2300: 6e 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  n1, 1);.    sqli
2310: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
2320: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
2330: 65 2c 20 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a  e, in2, 1);.  }.
2340: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2350: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
2360: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
2370: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
2380: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
2390: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
23a0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
23b0: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
23c0: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
23d0: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
23e0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
23f0: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
2400: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
2410: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2420: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
2430: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
2440: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2450: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
2460: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
2470: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2480: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
2490: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
24a0: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
24b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24c0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
24d0: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
24e0: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
24f0: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
2500: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
2510: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
2520: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2530: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2540: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2550: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2560: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
2570: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
2580: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
2590: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
25a0: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
25b0: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
25c0: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
25d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
25e0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
25f0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
2600: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
2610: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
2620: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
2630: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
2640: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
2650: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
2660: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
2670: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
2680: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
2690: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
26a0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
26b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
26c0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
26d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
26e0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
26f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
2700: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
2710: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
2720: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
2730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
2740: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
2750: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
2760: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
2770: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
2780: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
27a0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
27b0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
27c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
27d0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
27e0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
27f0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2800: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
2810: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2820: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
2830: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
2840: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2850: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2860: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
2870: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2880: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
2890: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
28a0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
28b0: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
28c0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
28d0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
28e0: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
28f0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2900: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
2910: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2920: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2930: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
2940: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2950: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2960: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
2970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2980: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
2990: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
29a0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29b0: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
29c0: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
29d0: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
29e0: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
29f0: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
2a00: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
2a10: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
2a20: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
2a30: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
2a40: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
2a50: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
2a60: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
2a70: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
2a80: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
2a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2aa0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ab0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2ac0: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2ad0: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2ae0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2af0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2b00: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2b10: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2b20: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2b30: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2b40: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2b50: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2b60: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
2b70: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2b80: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
2b90: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   &nHeight);.  }.
2ba0: 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e    p->nHeight = n
2bb0: 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f  Height + 1;.}../
2bc0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2bd0: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2be0: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78 70  le using the exp
2bf0: 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75 6e  rSetHeight() fun
2c00: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65  ction. If.** the
2c10: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2c20: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69  er than the maxi
2c30: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72  mum allowed expr
2c40: 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a  ession depth,.**
2c50: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2c60: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
2c70: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
2c80: 74 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  tHeight(Parse *p
2c90: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
2ca0: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
2cb0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
2cc0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
2cd0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
2ce0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2cf0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
2d00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
2d10: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
2d20: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
2d30: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
2d40: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
2d50: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
2d60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2d70: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
2d80: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2d90: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2da0: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
2db0: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
2dc0: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
2dd0: 0a 20 20 23 64 65 66 69 6e 65 20 65 78 70 72 53  .  #define exprS
2de0: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
2df0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
2e00: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
2e10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2e20: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
2e30: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
2e40: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
2e50: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
2e60: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2e70: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
2e80: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
2e90: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
2ea0: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
2eb0: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
2ec0: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
2ed0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
2ee0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2ef0: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
2f00: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2f10: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
2f20: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2f30: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
2f40: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
2f50: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
2f60: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
2f70: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
2f80: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
2f90: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
2fa0: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
2fb0: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
2fc0: 73 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20  s performance.  
2fd0: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
2fe0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
2ff0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
3000: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
3010: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
3020: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
3030: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
3040: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
3050: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
3060: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
3070: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
3080: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
3090: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
30a0: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
30b0: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
30c0: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
30d0: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
30e0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
30f0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
3100: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
3110: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
3120: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
3130: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
3140: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
3150: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
3160: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
3170: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
3180: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
3190: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
31a0: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
31b0: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
31c0: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
31d0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
31e0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
31f0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
3200: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3210: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
3220: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3230: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
3240: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
3250: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
3260: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
3270: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
3280: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3290: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
32a0: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
32b0: 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65  oken,    /* Toke
32c0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
32d0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
32e0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3300: 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b  to dequote */.){
3310: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3320: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
3330: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20  .  int iValue = 
3340: 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  0;..  if( pToken
3350: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
3360: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
3370: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
3380: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
3390: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
33a0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
33b0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
33c0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
33d0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
33e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
33f0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3400: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
3410: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3420: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3430: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3440: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3450: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3460: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3470: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3480: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
3490: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
34a0: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
34b0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
34c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
34d0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
34e0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
34f0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
3500: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
3510: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3520: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3530: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3540: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
3550: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
3560: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
3570: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
3580: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
3590: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
35a0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
35b0: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
35c0: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
35d0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
35e0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
35f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3600: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3610: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3620: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3630: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3640: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
3650: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
3660: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
3670: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
3680: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
3690: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
36a0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
36b0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
36c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
36d0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
36e0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
36f0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3700: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3710: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3720: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3730: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3740: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
3750: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
3760: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
3770: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
3780: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
3790: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
37a0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
37b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
37c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
37d0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
37e0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
37f0: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3800: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3810: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3820: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3830: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
3850: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3860: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
3870: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
3880: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
3890: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
38a0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
38b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
38c0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
38d0: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
38e0: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
38f0: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3900: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3910: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3920: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3930: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3940: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3950: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3960: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3970: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
3980: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
3990: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
39a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
39b0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
39c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
39d0: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
39e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
39f0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3a00: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3a10: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69   pRight;.      i
3a20: 66 28 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  f( pRight->flags
3a30: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   ){.        pRoo
3a50: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  t->flags |= EP_E
3a60: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
3a70: 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20     pRoot->pColl 
3a80: 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b  = pRight->pColl;
3a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3aa0: 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a     if( pLeft ){.
3ab0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65        pRoot->pLe
3ac0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  ft = pLeft;.    
3ad0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61    if( pLeft->fla
3ae0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
3af0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  te ){.        pR
3b00: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
3b10: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
3b20: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c       pRoot->pCol
3b30: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
3b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3b50: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
3b60: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
3b70: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
3b80: 61 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  a Expr node whic
3b90: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
3ba0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
3bb0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
3bc0: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
3bd0: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
3be0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3bf0: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
3c00: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
3c10: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
3c20: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
3c30: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
3c40: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
3c50: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
3c60: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
3c70: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
3c80: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
3c90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3ca0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3cb0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3cd0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3ce0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
3cf0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
3d00: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
3d10: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
3d20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
3d30: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
3d40: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
3d50: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
3d60: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
3d70: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
3d80: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
3d90: 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70  Parse->db, op, p
3da0: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 73 71 6c  Token, 1);.  sql
3db0: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
3dc0: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
3dd0: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
3de0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ght);.  return p
3df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
3e00: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
3e10: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
3e20: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
3e30: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
3e40: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
3e50: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
3e60: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
3e70: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3e80: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
3e90: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
3ea0: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
3eb0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
3ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
3ed0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
3ee0: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
3ef0: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
3f00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78  .  }else{.    Ex
3f10: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
3f20: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
3f30: 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20  TK_AND, 0, 0);. 
3f40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
3f50: 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c  tachSubtrees(db,
3f60: 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52   pNew, pLeft, pR
3f70: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
3f80: 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n pNew;.  }.}../
3f90: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
3fa0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3fb0: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
3fc0: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
3fd0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
3fe0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3ff0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72  ExprFunction(Par
4000: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
4010: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
4020: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
4030: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c  xpr *pNew;.  sql
4040: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4050: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
4060: 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65   pToken );.  pNe
4070: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
4080: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43  lloc(db, TK_FUNC
4090: 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29  TION, pToken, 1)
40a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
40b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
40c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
40d0: 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69   pList); /* Avoi
40e0: 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68  d memory leak wh
40f0: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  en malloc fails 
4100: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
4110: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70  .  }.  pNew->x.p
4120: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
4130: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
4140: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
4150: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
4160: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
4170: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
4180: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
4190: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
41a0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
41b0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
41c0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
41d0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
41e0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
41f0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
4200: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
4210: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
4220: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
4230: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
4240: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
4250: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
4260: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
4270: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
4280: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
4290: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
42a0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
42b0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
42c0: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
42d0: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
42e0: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
42f0: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
4300: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
4310: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
4320: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
4330: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
4340: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
4350: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
4360: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
4370: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
4380: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
4390: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
43a0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
43b0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
43c0: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
43d0: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
43e0: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
43f0: 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  enial variable n
4400: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
4410: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
4420: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
4430: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
4440: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
4450: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
4460: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4470: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4480: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
4490: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
44a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
44b0: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
44c0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
44d0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
44e0: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
44f0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
4500: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
4510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
4520: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b  ]!=0 );.  if( z[
4530: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  1]==0 ){.    /* 
4540: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
4550: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
4560: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
4570: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4580: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d    assert( z[0]==
4590: 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72  '?' );.    pExpr
45a0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2b 2b 70 50  ->iColumn = ++pP
45b0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65  arse->nVar;.  }e
45c0: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f  lse if( z[0]=='?
45d0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
45e0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
45f0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
4600: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
4610: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
4620: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4630: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4640: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
4650: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4660: 3d 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72  = i = atoi((char
4670: 2a 29 26 7a 5b 31 5d 29 3b 0a 20 20 20 20 74 65  *)&z[1]);.    te
4680: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
4690: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
46a0: 3d 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =1 );.    testca
46b0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
46c0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
46d0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
46e0: 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
46f0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4700: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4710: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4720: 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c  ;.    if( i<1 ||
4730: 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   i>db->aLimit[SQ
4740: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4750: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
4760: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
4780: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
4790: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
47a0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
47b0: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
47c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
47d0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
47e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
47f0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
4800: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4810: 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ar = i;.    }.  
4820: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
4830: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
4840: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
4850: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
4860: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
4870: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
4880: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
4890: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
48a0: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
48b0: 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61  e name.    ** ha
48c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
48d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
48e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
48f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20   number.    */. 
4900: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33     int i;.    u3
4910: 32 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  2 n;.    n = sql
4920: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
4930: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4940: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4950: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
4960: 70 72 20 2a 70 45 20 3d 20 70 50 61 72 73 65 2d  pr *pE = pParse-
4970: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 3b 0a 20  >apVarExpr[i];. 
4980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
4990: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
49a0: 6d 65 6d 63 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f  memcmp(pE->u.zTo
49b0: 6b 65 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26  ken, z, n)==0 &&
49c0: 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d   pE->u.zToken[n]
49d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
49e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
49f0: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pE->iColumn;.   
4a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
4a20: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  ( i>=pParse->nVa
4a30: 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  rExpr ){.      p
4a40: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4a50: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
4a60: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
4a70: 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61 72  ->nVarExpr>=pPar
4a80: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
4a90: 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  c-1 ){.        p
4aa0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
4ab0: 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e  lloc += pParse->
4ac0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20  nVarExprAlloc + 
4ad0: 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  10;.        pPar
4ae0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d 0a  se->apVarExpr =.
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4b00: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
4b10: 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ee(.            
4b20: 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20    db,.          
4b30: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
4b40: 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  rExpr,.         
4b50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
4b60: 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f  rExprAlloc*sizeo
4b70: 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  f(pParse->apVarE
4b80: 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  xpr[0]).        
4b90: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
4ba0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
4bb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
4bc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
4bd0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21  arse->apVarExpr!
4be0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
4bf0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
4c00: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4c10: 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ++] = pExpr;.   
4c20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a     }.    }.  } .
4c30: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
4c40: 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Err && pParse->n
4c50: 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  Var>db->aLimit[S
4c60: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4c70: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
4c80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4c90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
4ca0: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
4cb0: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
4cc0: 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 20 65 78 70  .** Clear an exp
4cd0: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
4ce0: 65 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  e without deleti
4cf0: 6e 67 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ng the structure
4d00: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 53 75 62 73   itself..** Subs
4d10: 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c 65  tructure is dele
4d20: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
4d30: 69 74 65 33 45 78 70 72 43 6c 65 61 72 28 73 71  ite3ExprClear(sq
4d40: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
4d50: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
4d60: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78  !=0 );.  if( !Ex
4d70: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4d80: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
4d90: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4da0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4db0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
4dc0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4dd0: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
4de0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
4df0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
4e00: 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e 66  educed) && (p->f
4e10: 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c  lags2 & EP2_Mall
4e20: 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  ocedToken)!=0 ){
4e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4e40: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
4e50: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oken);.    }.   
4e60: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
4e70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
4e80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
4e90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
4ea0: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  te(db, p->x.pSel
4eb0: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
4ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4ed0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
4ee0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4ef0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4f00: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
4f10: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
4f20: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
4f30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4f40: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
4f50: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
4f60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4f70: 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
4f80: 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 21  (db, p);.  if( !
4f90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4fa0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
4fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4fc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
4fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4fe0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4ff0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5000: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5010: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5020: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5030: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5040: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5050: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5060: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5070: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5080: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5090: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
50a0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
50b0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
50c0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
50d0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
50e0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
50f0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5100: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5110: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5120: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5130: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5140: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5150: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5160: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5170: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5180: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5190: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
51a0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
51b0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
51c0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
51d0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
51e0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
51f0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5200: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5210: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5220: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5230: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5240: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5250: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5260: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5270: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5280: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5290: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
52a0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
52b0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
52c0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
52d0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
52e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5320: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
5330: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5340: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
5350: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
5360: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
5370: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
5380: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
5390: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
53a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
53b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
53c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
53d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
53e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
53f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
5400: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
5410: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
5420: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
5430: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
5440: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
5450: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
5460: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
5470: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5480: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
5490: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
54a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
54b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
54c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
54d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
54e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
54f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
5500: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
5510: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
5520: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
5530: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
5540: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
5550: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
5560: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
5570: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
5580: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
5590: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
55a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
55b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
55c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
55d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
55e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
55f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
5600: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
5610: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
5620: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
5630: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
5640: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
5650: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
5660: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5670: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
5680: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
5690: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
56a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
56b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
56c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
56d0: 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52 45  ake a EXPRDUP_RE
56e0: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
56f0: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
5700: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
5710: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
5720: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
5730: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
5740: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
5750: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
5760: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
5770: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
5780: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
5790: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
57a0: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
57b0: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
57c0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
57d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
57e0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
57f0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
5800: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
5810: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
5820: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
5830: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
5840: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
5850: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
5860: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c   */.  if( 0==(fl
5870: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5880: 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  CE) ){.    nSize
5890: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
58a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
58b0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
58c0: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
58d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
58e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
58f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5900: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
5910: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
5920: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
5930: 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64  2 & EP2_Malloced
5940: 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20  Token)==0 );.   
5950: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
5960: 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64 75  gs2 & EP2_Irredu
5970: 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20  cible)==0 );.   
5980: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
5990: 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d   p->pRight || p-
59a0: 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70  >pColl || p->x.p
59b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
59c0: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
59d0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
59e0: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
59f0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
5a00: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5a10: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
5a20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5a30: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
5a40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5a50: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
5a60: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
5a70: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
5a80: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
5a90: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5aa0: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
5ab0: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
5ac0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
5ad0: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
5ae0: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
5af0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
5b00: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
5b10: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5b20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
5b30: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5b40: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
5b50: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
5b60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b70: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
5b80: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
5b90: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
5ba0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
5bb0: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
5bc0: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
5bd0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
5be0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5bf0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
5c00: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
5c10: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
5c20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
5c30: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5c40: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
5c50: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5c60: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
5c70: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
5c80: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
5c90: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5ca0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
5cb0: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
5cc0: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
5cd0: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
5ce0: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
5cf0: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
5d00: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
5d10: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
5d20: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
5d30: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
5d40: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
5d50: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
5d60: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
5d70: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
5d80: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
5d90: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
5da0: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
5db0: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
5dc0: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
5dd0: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
5de0: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
5df0: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
5e00: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5e10: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
5e20: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
5e30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
5e40: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
5e50: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
5e60: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
5e70: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5e80: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
5e90: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
5ea0: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
5eb0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5ec0: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
5ed0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
5ee0: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
5ef0: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
5f00: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
5f10: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
5f20: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
5f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5f40: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
5f50: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
5f60: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
5f70: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
5f80: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
5f90: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
5fa0: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
5fb0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
5fc0: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
5fd0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5fe0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
5ff0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
6000: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
6010: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
6020: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
6030: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
6040: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
6050: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
6060: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
6070: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
6080: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
6090: 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64  irst byte passed
60a0: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
60b0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
60c0: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
60d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
60e0: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
60f0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
6100: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
6110: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
6120: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
6130: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
6140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
6150: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
6160: 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  /.  if( p ){.   
6170: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64   const int isRed
6180: 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58  uced = (flags&EX
6190: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
61a0: 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20     u8 *zAlloc;. 
61b0: 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61     u32 staticFla
61c0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  g = 0;..    asse
61d0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
61e0: 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a  || isReduced );.
61f0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
6200: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
6210: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
6220: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
6230: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
6240: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
6250: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20  *pzBuffer;.     
6260: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
6270: 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c  _Static;.    }el
6280: 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63  se{.      zAlloc
6290: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
62a0: 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45  ocRaw(db, dupedE
62b0: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
62c0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
62d0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
62e0: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
62f0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
6300: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
6310: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
6320: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
6330: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
6340: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
6350: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
6360: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
6370: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6380: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
6390: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
63a0: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
63b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
63c0: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
63d0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
63e0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
63f0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
6400: 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
6410: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
6420: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
6430: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6440: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
6450: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
6460: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
6470: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
6480: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ;.      int nTok
6490: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  en;.      if( !E
64a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
64b0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
64c0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
64d0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
64e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
64f0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
6500: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
6510: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
6520: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6530: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
6540: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6550: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
6560: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
6570: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
6580: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
6590: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
65a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
65b0: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65     int nSize = e
65c0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
65d0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
65e0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
65f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
6600: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
6610: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
6620: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
6630: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
6640: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
6650: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
6660: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
6670: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
6680: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  y. */.      pNew
6690: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
66a0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
66b0: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b  Only|EP_Static);
66c0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
66d0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
66e0: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
66f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
6700: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6710: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
6720: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
6730: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6740: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
6750: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  /.      if( nTok
6760: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  en ){.        ch
6770: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
6780: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6790: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
67a0: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  wSize];.        
67b0: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
67c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
67d0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  en);.      }..  
67e0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
67f0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
6800: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
6810: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  y) ){.        /*
6820: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
6830: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
6840: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
6850: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mber. */.       
6860: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6870: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
6880: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
6890: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
68a0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
68b0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
68c0: 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65  Select, isReduce
68d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
68e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
68f0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
6900: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6910: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
6920: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6930: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6940: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6950: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
6960: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
6970: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
6980: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e  asAnyProperty(pN
6990: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
69a0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
69b0: 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b          zAlloc +
69c0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
69d0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
69e0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
69f0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
6a00: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
6a10: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6a20: 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28  pLeft = exprDup(
6a30: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
6a40: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6a50: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6a60: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
6a70: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6a80: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
6a90: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
6aa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6ab0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6ac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
6ad0: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
6ae0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6af0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6b00: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20   pNew->flags2 = 
6b10: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  0;.        if( !
6b20: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6b30: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
6b40: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
6b50: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
6b60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6b70: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
6b80: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6b90: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
6ba0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6bb0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
6bc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6bd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6be0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6bf0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
6c00: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
6c10: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
6c20: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
6c30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
6c40: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
6c50: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
6c60: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
6c70: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
6c80: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
6c90: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
6ca0: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
6cb0: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
6cc0: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
6cd0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
6ce0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
6cf0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
6d00: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
6d10: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
6d20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6d30: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
6d40: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
6d50: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
6d60: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
6d70: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
6d80: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
6d90: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6da0: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
6db0: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
6dc0: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
6dd0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
6de0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
6df0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
6e00: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
6e10: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
6e20: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
6e30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
6e40: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
6e50: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6e60: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6e70: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
6e80: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
6e90: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
6ea0: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
6eb0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6ec0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
6ed0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
6ee0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
6ef0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
6f00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
6f10: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
6f20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
6f30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6f40: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6f50: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75  .  return exprDu
6f60: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
6f70: 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a  0);.}.ExprList *
6f80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6f90: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
6fa0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
6fb0: 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c   flags){.  ExprL
6fc0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
6fd0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6fe0: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
6ff0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
7000: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7010: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
7020: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7030: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
7040: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
7050: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7060: 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72    pNew->iECursor
7070: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45   = 0;.  pNew->nE
7080: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
7090: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
70a0: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
70b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
70c0: 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45  ocRaw(db,  p->nE
70d0: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
70e0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
70f0: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
7100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7110: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7120: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
7130: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
7140: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
7150: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
7160: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
7170: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
7180: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
7190: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
71a0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
71b0: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
71c0: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
71d0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
71e0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
71f0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7200: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
7210: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
7220: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7230: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
7240: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
7250: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
7260: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
7270: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
7280: 20 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d     pItem->iCol =
7290: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b   pOldItem->iCol;
72a0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69  .    pItem->iAli
72b0: 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  as = pOldItem->i
72c0: 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74  Alias;.  }.  ret
72d0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
72e0: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
72f0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
7300: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
7310: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
7320: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
7330: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
7340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
7350: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
7360: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
7370: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
7380: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
7390: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
73a0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
73b0: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
73c0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
73d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
73e0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
73f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7400: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
7410: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7420: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7430: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
7440: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
7450: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
7460: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7470: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
7480: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7490: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
74a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
74b0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
74c0: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
74d0: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
74e0: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
74f0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
7500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7510: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
7520: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7530: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7540: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
7550: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
7560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7570: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
7580: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7590: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
75a0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
75b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
75c0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
75d0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
75e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
75f0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7600: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7610: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7620: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7640: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7650: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7660: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7670: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7680: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7690: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
76a0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
76b0: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
76c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
76d0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
76e0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
76f0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7700: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7710: 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f  isPopulated = pO
7720: 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ldItem->isPopula
7730: 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ted;.    pNewIte
7740: 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
7750: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7760: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pOldItem->zIndex
7770: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7780: 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f  >notIndexed = pO
7790: 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ldItem->notIndex
77a0: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
77b0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  ->pIndex = pOldI
77c0: 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  tem->pIndex;.   
77d0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
77e0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
77f0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
7800: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
7810: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
7820: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
7830: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7840: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
7850: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
7860: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
7870: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
7880: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7890: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
78a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
78b0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
78c0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
78d0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
78e0: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
78f0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
7900: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
7910: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
7920: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
7930: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7940: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
7950: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
7960: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7970: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7990: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
79a0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
79b0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
79c0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
79d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
79e0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
79f0: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
7a00: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
7a10: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
7a20: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
7a30: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
7a40: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
7a50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7a60: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
7a70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
7a80: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
7a90: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7aa0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
7ab0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
7ac0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
7ad0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
7ae0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
7af0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7b00: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7b10: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7b20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
7b30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
7b40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
7b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7b60: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
7b70: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
7b80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
7b90: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
7ba0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
7bb0: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
7bc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7bd0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7be0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7bf0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
7c00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7c10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
7c20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7c30: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
7c40: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ist, flags);.  p
7c50: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
7c60: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
7c70: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
7c80: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
7c90: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
7ca0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
7cb0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7cc0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
7cd0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7ce0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
7cf0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7d00: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
7d10: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7d20: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
7d30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
7d40: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7d50: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7d60: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
7d70: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
7d80: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
7d90: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
7da0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
7db0: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
7dc0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
7dd0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7de0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
7df0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
7e00: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
7e10: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
7e20: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
7e30: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
7e40: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
7e50: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
7e60: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
7e70: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
7e80: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
7e90: 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
7ea0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  0;.  pNew->addrO
7eb0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
7ec0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
7ed0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
7ee0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
7ef0: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72  phm[2] = -1;.  r
7f00: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
7f10: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
7f20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7f30: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7f40: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7f50: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
7f70: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7f80: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
7f90: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
7fa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
7fb0: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
7fc0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
7fd0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
7fe0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
7ff0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
8000: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8010: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
8020: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
8030: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
8040: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
8050: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
8060: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
8070: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
8080: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
8090: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
80a0: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
80b0: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
80c0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
80d0: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
80e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
80f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8100: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8110: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8120: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
8130: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
8140: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
8150: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
8160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
8170: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
8180: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
8190: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
81a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
81b0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
81c0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
81d0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
81e0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
81f0: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
8200: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
8210: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
8220: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
8230: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
8240: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  ->nAlloc==0 );. 
8250: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
8260: 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e  nAlloc<=pList->n
8270: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75  Expr ){.    stru
8280: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8290: 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d   *a;.    int n =
82a0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
82b0: 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 4;.    a = sq
82c0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
82d0: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  b, pList->a, n*s
82e0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
82f0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
8300: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
8310: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
8320: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
8330: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
8340: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
8350: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f 73  locSize(db, a)/s
8360: 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d  izeof(a[0]);.  }
8370: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
8380: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
8390: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
83a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
83b0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
83c0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
83d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
83e0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
83f0: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
8400: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
8410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8420: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
8430: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
8440: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
8450: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
8460: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
8470: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8480: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
8490: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
84a0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
84b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
84c0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
84d0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
84e0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
84f0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
8500: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
8510: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
8520: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
8530: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
8540: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
8550: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
8560: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
8570: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
8580: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
8590: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
85a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
85b0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
85c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
85d0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
85e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
8600: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8610: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8620: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
8630: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
8640: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
8650: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
8660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
8670: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
8680: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
8690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
86a0: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
86b0: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
86c0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
86d0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
86e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
86f0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
8700: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
8710: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8720: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8730: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8740: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
8750: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
8760: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
8770: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
8780: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
8790: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
87a0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
87b0: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
87c0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
87d0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
87e0: 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d  equote && pItem-
87f0: 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33  >zName ) sqlite3
8800: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
8810: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
8820: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
8830: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
8840: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
8850: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
8860: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
8870: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8880: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
8890: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
88a0: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
88b0: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
88c0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
88d0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
88e0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
88f0: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
8900: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8910: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
8920: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
8930: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
8940: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
8950: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8960: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8970: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8980: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
8990: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
89a0: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
89b0: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
89c0: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
89d0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
89e0: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
89f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8a00: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
8a10: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
8a20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
8a30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
8a40: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
8a50: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8a60: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
8a70: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
8a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
8a90: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
8aa0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
8ab0: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
8ac0: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
8ad0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
8ae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8af0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
8b00: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
8b10: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
8b20: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
8b30: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
8b70: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
8b80: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
8b90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
8ba0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
8bb0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
8bc0: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
8bd0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
8be0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8bf0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
8c00: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
8c10: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
8c20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8c30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8c40: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
8c50: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
8c60: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
8c70: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8c80: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
8c90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
8ca0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
8cb0: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
8cc0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
8cd0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
8ce0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
8cf0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
8d00: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
8d10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8d20: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8d30: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
8d40: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
8d50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
8d60: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
8d70: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
8d80: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8d90: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
8da0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
8db0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
8dc0: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
8dd0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8de0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
8df0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
8e00: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
8e10: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
8e20: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
8e30: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
8e40: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
8e50: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
8e60: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
8e70: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
8e80: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
8e90: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8eb0: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
8ec0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
8ed0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8ee0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8ef0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8f00: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
8f10: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8f20: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
8f30: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
8f40: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
8f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
8f60: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
8f70: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20  lker callbacks. 
8f80: 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20   Walker.u.pi is 
8f90: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8fa0: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
8fb0: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
8fc0: 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72  checking an expr
8fd0: 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a  ession to see.**
8fe0: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73   if it is a cons
8ff0: 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b  tant.  Set *Walk
9000: 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20  er.u.pi to 0 if 
9010: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9020: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  s.** not constan
9030: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  t..**.** These c
9040: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
9050: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
9060: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
9070: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
9080: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9090: 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73  stant().**     s
90a0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
90b0: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a  tantNotJoin().**
90c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
90d0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
90e0: 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61  tion().**.*/.sta
90f0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
9100: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
9110: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
9120: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
9130: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  If pWalker->u.i 
9140: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
9150: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
9160: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
9170: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
9180: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9190: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
91a0: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
91b0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
91c0: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
91d0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
91e0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
91f0: 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73  .i==3 && ExprHas
9200: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
9210: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
9220: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
9230: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  u.i = 0;.    ret
9240: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9250: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
9260: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
9270: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
9280: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
9290: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
92a0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
92b0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
92c0: 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  nd pWalker->u.i=
92d0: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
92e0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
92f0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
9300: 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30  .i==2 ) return 0
9310: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
9320: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
9330: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
9340: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
9350: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
9360: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
9370: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
9380: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9390: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
93a0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
93b0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
93c0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
93d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
93e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
93f0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
9400: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
9410: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
9420: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61  UMN );.      pWa
9430: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
9440: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9450: 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75  Abort;.    defau
9460: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
9470: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9480: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
9490: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
94a0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
94b0: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
94c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
94d0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
94e0: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
94f0: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
9500: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
9510: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
9520: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
9530: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
9540: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9550: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9560: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
9570: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
9580: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
9590: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
95a0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
95b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
95c0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
95d0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
95e0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
95f0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
9600: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
9610: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
9620: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
9630: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
9640: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9650: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9660: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9670: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9680: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9690: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
96a0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
96b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
96c0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
96d0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
96e0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
96f0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
9700: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
9710: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9720: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9730: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9740: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9750: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9760: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9770: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9780: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9790: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
97a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
97b0: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
97c0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
97d0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
97e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
97f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9800: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
9810: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9820: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9830: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9840: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9850: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9860: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9870: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9880: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9890: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
98a0: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
98b0: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
98c0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
98d0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
98e0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
98f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9900: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9910: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
9920: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9930: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9940: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9950: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9960: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9970: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9980: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9990: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
99a0: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
99b0: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
99c0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
99d0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
99e0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
99f0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9a00: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
9a10: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9a20: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9a30: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9a40: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9a50: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9a60: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9a70: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9a80: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9a90: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9aa0: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9ab0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9ac0: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
9ad0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
9ae0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
9af0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
9b00: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
9b10: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
9b20: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9b30: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9b40: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9b50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9b60: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9b70: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9b80: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9b90: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9ba0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9bb0: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
9bc0: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
9bd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9be0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
9bf0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
9c00: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
9c10: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  0;.  if( p->flag
9c20: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
9c30: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
9c40: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
9c50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9c60: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
9c70: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9c80: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
9c90: 72 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49  rc = sqlite3GetI
9ca0: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
9cb0: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
9cc0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
9cd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9ce0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9cf0: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
9d00: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
9d10: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
9d20: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
9d30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d40: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
9d50: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
9d60: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
9d70: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9d80: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
9d90: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
9da0: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
9db0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
9dc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9dd0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
9de0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
9df0: 28 20 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65  ( rc ){.    asse
9e00: 72 74 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  rt( ExprHasAnyPr
9e10: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
9e20: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9e30: 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y).             
9e40: 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 32 20    || (p->flags2 
9e50: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
9e60: 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ken)==0 );.    p
9e70: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  ->op = TK_INTEGE
9e80: 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  R;.    p->flags 
9e90: 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
9ea0: 20 20 20 20 70 2d 3e 75 2e 69 56 61 6c 75 65 20      p->u.iValue 
9eb0: 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20  = *pValue;.  }. 
9ec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9ed0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
9ee0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
9ef0: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
9f00: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
9f10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
9f20: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
9f30: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
9f40: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
9f50: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
9f60: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
9f70: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
9f80: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
9f90: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
9fa0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
9fb0: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
9fc0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
9fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9fe0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
9ff0: 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70  ble to the IN op
a000: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
a010: 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72  ion on a.** quer
a020: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
a030: 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28  .**       x IN (
a040: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
a050: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
a060: 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20  CT... clause is 
a070: 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
a080: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  the parameter to
a090: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
a0a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65  ..**.** The Sele
a0b0: 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ct object passed
a0c0: 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20   in has already 
a0d0: 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65  been preprocesse
a0e0: 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f  d and no.** erro
a0f0: 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75  rs have been fou
a100: 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nd..*/.#ifndef S
a110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a120: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
a130: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
a140: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
a150: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
a160: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a170: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
a180: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
a190: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
a1b0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
a1c0: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
a1d0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
a1e0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
a1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
a200: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
a210: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
a220: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
a230: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
a240: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
a250: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
a260: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
a270: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
a280: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
a290: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a2a0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
a2b0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
a2c0: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
a2d0: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
a2e0: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
a2f0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
a300: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
a310: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
a320: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
a330: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
a340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
a350: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
a360: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
a370: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
a380: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
a390: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
a3a0: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
a3b0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
a3c0: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
a3d0: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
a3e0: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
a3f0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
a400: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a420: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
a430: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
a440: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
a450: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
a460: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
a470: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
a480: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
a490: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
a4a0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
a4b0: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
a4c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
a4d0: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
a4e0: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
a4f0: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
a500: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
a510: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62    if( NEVER(pTab
a520: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
a530: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
a540: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
a550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
a560: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
a570: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
a580: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
a590: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
a5a0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
a5b0: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
a5c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
a5d0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
a5e0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
a5f0: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
a600: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
a610: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
a620: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
a630: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
a640: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
a650: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
a660: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
a670: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
a680: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a6a0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
a6b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a6c0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
a6d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
a6e0: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
a6f0: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
a700: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
a710: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
a720: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
a730: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
a740: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
a750: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
a760: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
a770: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
a780: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
a790: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
a7a0: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
a7b0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75   index of the cu
a7c0: 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74  rsor opened on t
a7d0: 68 65 20 62 2d 74 72 65 65 20 28 64 61 74 61 62  he b-tree (datab
a7e0: 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62  ase table, datab
a7f0: 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72  ase index .** or
a800: 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29   ephermal table)
a810: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58   is stored in pX
a820: 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20  ->iTable before 
a830: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
a840: 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65  turns..** The re
a850: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
a860: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
a870: 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
a880: 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
a890: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
a8a0: 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68  INDEX_ROWID - Th
a8b0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
a8c0: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
a8d0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
a8e0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54  _INDEX_INDEX - T
a8f0: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
a900: 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61  ened on a databa
a910: 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  se index..**   I
a920: 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20  N_INDEX_EPH -   
a930: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
a940: 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
a950: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
a960: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a970: 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
a980: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
a990: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
a9a0: 69 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20 6f  ing b-tree may o
a9b0: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74  nly be used if t
a9c0: 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
a9d0: 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f  the simple.** fo
a9e0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  rm:.**.**     SE
a9f0: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
aa00: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
aa10: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
aa20: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
aa30: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
aa40: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
aa50: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
aa60: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
aa70: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
aa80: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
aa90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
aaa0: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
aab0: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
aac0: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
aad0: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
aae0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
aaf0: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
ab00: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
ab10: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
ab20: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
ab30: 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63  * has a UNIQUE c
ab40: 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49  onstraint or UNI
ab50: 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  QUE index..**.**
ab60: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
ab70: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
ab80: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
ab90: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
aba0: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
abb0: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
abc0: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
abd0: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
abe0: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
abf0: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
ac00: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
ac10: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ac20: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
ac30: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
ac40: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
ac50: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
ac60: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lumn..**.** When
ac70: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
ac80: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
ac90: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
aca0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
acb0: 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  tion.** needs to
acc0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
acd0: 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75   not the structu
ace0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53  re contains an S
acf0: 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75  QL NULL .** valu
ad00: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
ad10: 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65  rrectly evaluate
ad20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b   expressions lik
ad30: 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e  e "X IN (Y, Z)".
ad40: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
ad50: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
ad60: 65 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 63  e b-tree might c
ad70: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
ad80: 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
ad90: 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
ada0: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
adb0: 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
adc0: 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
add0: 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e  ** to *prNotFoun
ade0: 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  d. If there is n
adf0: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
ae00: 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
ae10: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
ae20: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
ae30: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
ae40: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
ae50: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
ae60: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
ae70: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
ae80: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
ae90: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
aea0: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
aeb0: 4c 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  L. If the b-tree
aec0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
aed0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
aee0: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
aef0: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
af00: 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
af10: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 62   generates the b
af20: 2d 74 72 65 65 0a 2a 2a 20 69 73 20 61 20 63 6f  -tree.** is a co
af30: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
af40: 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  y) then the valu
af50: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
af60: 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ed register is.*
af70: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
af80: 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 62 2d  each time the b-
af90: 74 72 65 65 20 69 73 20 72 65 70 6f 70 75 6c 61  tree is repopula
afa0: 74 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ted. This allows
afb0: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
afc0: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
afd0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
afe0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
aff0: 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65  **   if( registe
b000: 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20  r==NULL ){.**   
b010: 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65    has_null = <te
b020: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
b030: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
b040: 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73  ll>.**     regis
b050: 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a  ter = 1.**   }.*
b060: 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  *.** in order to
b070: 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74   avoid running t
b080: 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61  he <test if data
b090: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
b0a0: 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73  ins null>.** tes
b0b0: 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  t more often tha
b0c0: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
b0d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
b0e0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b0f0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
b100: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
b110: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
b120: 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29  int *prNotFound)
b130: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
b160: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
b170: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
b180: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
b190: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
b1b0: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
b1c0: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
b1d0: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
b1e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
b1f0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
b200: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
b210: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
b220: 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74  eUnique = (prNot
b230: 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20  Found==0);   /* 
b240: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
b250: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 0a 20   be unique */.. 
b260: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
b270: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
b280: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
b290: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
b2a0: 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
b2b0: 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
b2c0: 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
b2d0: 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
b2e0: 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
b2f0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ble..  */.  p = 
b300: 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
b310: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
b320: 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65  t) ? pX->x.pSele
b330: 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41  ct : 0);.  if( A
b340: 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45  LWAYS(pParse->nE
b350: 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64  rr==0) && isCand
b360: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
b370: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
b380: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b3a0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
b3b0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70  ction */.    Exp
b3c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  r *pExpr = p->pE
b3d0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
b3e0: 3b 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f  ;   /* Expressio
b3f0: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
b400: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
b410: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  pr->iColumn;    
b420: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
b430: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c  x of column <col
b440: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62 65  umn> */.    Vdbe
b450: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
b460: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
b470: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
b480: 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
b490: 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  d */.    Table *
b4a0: 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
b4b0: 61 5b 30 5d 2e 70 54 61 62 3b 20 20 20 20 20 20  a[0].pTab;      
b4c0: 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e  /* Table <table>
b4d0: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  . */.    int iDb
b4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
b510: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 0a  for pTab */.   .
b520: 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
b530: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 61  P_VerifyCookie a
b540: 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  nd OP_TableLock 
b550: 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  for <table>. */.
b560: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
b570: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
b580: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
b590: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
b5a0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
b5b0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
b5c0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
b5d0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
b5e0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
b5f0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
b600: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
b610: 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
b620: 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73   from two places
b630: 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20  . In both cases 
b640: 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20  the vdbe.    ** 
b650: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b660: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61   allocated. So a
b670: 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74  ssume sqlite3Get
b680: 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73  Vdbe() is always
b690: 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
b6a0: 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ul here..    */.
b6b0: 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20      assert(v);. 
b6c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
b6d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  .      int iMem 
b6e0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b6f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  ;.      int iAdd
b700: 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  r;..      iAddr 
b710: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b720: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d  Op1(v, OP_If, iM
b730: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
b740: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b750: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
b760: 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Mem);..      sql
b770: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
b780: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
b790: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
b7a0: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
b7b0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
b7c0: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
b7d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b7e0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
b7f0: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
b800: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b820: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
b830: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
b840: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
b850: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
b860: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
b870: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
b880: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
b890: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
b8a0: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
b8b0: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
b8c0: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
b8d0: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
b8e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
b8f0: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
b900: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
b910: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
b920: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
b930: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
b940: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
b950: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
b960: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
b970: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
b980: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
b990: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
b9a0: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
b9b0: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
b9c0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
b9d0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
b9e0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
b9f0: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
ba00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
ba10: 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69  ar aff = compari
ba20: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58 29 3b  sonAffinity(pX);
ba30: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
ba40: 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e  ity_ok = (pTab->
ba50: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e  aCol[iCol].affin
ba60: 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53  ity==aff||aff==S
ba70: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
ba80: 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ..      for(pIdx
ba90: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
baa0: 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20  Idx && eType==0 
bab0: 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20  && affinity_ok; 
bac0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
bad0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
bae0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
baf0: 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20  ]==iCol).       
bb00: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64    && sqlite3Find
bb10: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
bb20: 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  db), pIdx->azCol
bb30: 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20  l[0], 0)==pReq. 
bb40: 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73          && (!mus
bb50: 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49  tBeUnique || (pI
bb60: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26  dx->nColumn==1 &
bb70: 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  & pIdx->onError!
bb80: 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20  =OE_None)).     
bb90: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
bba0: 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
bbb0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
bbc0: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a       int iAddr;.
bbd0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
bbe0: 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20  pKey;.  .       
bbf0: 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20     pKey = (char 
bc00: 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  *)sqlite3IndexKe
bc10: 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
bc20: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dx);.          i
bc30: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
bc40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
bc50: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
bc60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bc80: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20  ger, 1, iMem);. 
bc90: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
bca0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
bcb0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
bcc0: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
bcd0: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49      pKey,P4_KEYI
bd00: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
bd10: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
bd20: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
bd30: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
bd40: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
bd50: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a  N_INDEX_INDEX;..
bd60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bd70: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
bd80: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
bd90: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
bda0: 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c  d && !pTab->aCol
bdb0: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
bdc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
bdd0: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50  rNotFound = ++pP
bde0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
bdf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
be00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
be10: 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
be20: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
be30: 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e  uld not found an
be40: 20 65 78 69 73 74 69 6e 67 20 61 62 6c 65 20 6f   existing able o
be50: 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
be60: 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
be70: 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
be80: 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
be90: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
bea0: 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
beb0: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ob..    */.    i
bec0: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
bed0: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
bee0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
bef0: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
bf00: 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f  d ){.      *prNo
bf10: 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76  tFound = rMayHav
bf20: 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
bf30: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73  ->nMem;.    }els
bf40: 65 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d  e if( pX->pLeft-
bf50: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45  >iColumn<0 && !E
bf60: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
bf70: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
bf80: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 65 54 79  ct) ){.      eTy
bf90: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
bfa0: 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WID;.    }.    s
bfb0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
bfc0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
bfd0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
bfe0: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
bff0: 57 49 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  WID);.  }else{. 
c000: 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
c010: 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  iTab;.  }.  retu
c020: 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
c030: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
c040: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
c050: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
c060: 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73  ed as an express
c070: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70  ion.** and IN op
c080: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
c090: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
c0a0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
c0b0: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
c0c0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
c0d0: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
c0e0: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
c0f0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
c100: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
c110: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
c120: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
c130: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
c140: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
c150: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
c160: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
c170: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
c180: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
c190: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
c1a0: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
c1b0: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
c1c0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
c1d0: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
c1e0: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
c1f0: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
c200: 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
c210: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
c220: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
c230: 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
c240: 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
c250: 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
c260: 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
c270: 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
c280: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
c290: 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
c2a0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
c2b0: 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
c2c0: 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
c2d0: 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
c2e0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
c2f0: 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
c300: 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
c310: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
c320: 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
c330: 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
c340: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
c350: 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
c360: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
c370: 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
c380: 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
c390: 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
c3a0: 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
c3b0: 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
c3c0: 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
c3d0: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
c3e0: 74 68 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57  the IN is in a W
c3f0: 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20  HERE clause and 
c400: 74 68 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77  that we really w
c410: 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74  ant.** to iterat
c420: 65 20 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f  e over the RHS o
c430: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
c440: 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75  r in order to qu
c450: 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20  ickly locate.** 
c460: 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  all correspondin
c470: 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20  g LHS elements. 
c480: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
c490: 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
c4a0: 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69  lize.** the regi
c4b0: 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
c4c0: 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55  ayHaveNull to NU
c4d0: 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
c4e0: 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a  tines will take.
c4f0: 2a 2a 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ** care of chang
c500: 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
c510: 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  r value to non-N
c520: 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
c530: 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
c540: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
c550: 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74  ll is zero, that
c560: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
c570: 73 75 62 71 75 65 72 79 20 69 73 20 62 65 69 6e  subquery is bein
c580: 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65  g used.** for me
c590: 6d 62 65 72 73 68 69 70 20 74 65 73 74 69 6e 67  mbership testing
c5a0: 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73   only.  There is
c5b0: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74   no need to init
c5c0: 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65  ialize any.** re
c5d0: 67 69 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63  gisters to indic
c5e0: 61 74 65 20 74 68 65 20 70 72 65 73 65 6e 73 65  ate the presense
c5f0: 20 6f 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e   or absence of N
c600: 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e  ULLs on the RHS.
c610: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
c620: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
c630: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
c640: 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
c650: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c660: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
c670: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
c680: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
c690: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
c6a0: 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
c6b0: 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
c6c0: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
c6d0: 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  l,       /* Regi
c6e0: 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
c6f0: 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
c700: 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
c710: 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
c720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
c730: 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
c740: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
c750: 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
c760: 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20  testAddr = 0;   
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c780: 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
c790: 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
c7a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
c7b0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c7c0: 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  e);.  if( NEVER(
c7d0: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
c7e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
c7f0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
c800: 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
c810: 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69  must be run in i
c820: 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72  ts entirety ever
c830: 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  y time it is enc
c840: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66  ountered.  ** if
c850: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
c860: 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
c870: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
c880: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
c890: 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
c8a0: 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
c8b0: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
c8c0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
c8d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c8e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
c8f0: 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
c900: 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
c910: 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
c920: 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
c930: 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
c940: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
c950: 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
c960: 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
c970: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
c980: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
c990: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
c9a0: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
c9b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
c9c0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
c9d0: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
c9e0: 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65  lect) && !pParse
c9f0: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
ca00: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b  .    int mem = +
ca10: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ca20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca30: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d  dOp1(v, OP_If, m
ca40: 65 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64  em);.    testAdd
ca50: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ca60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
ca70: 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20  ger, 1, mem);.  
ca80: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64    assert( testAd
ca90: 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  dr>0 || pParse->
caa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cab0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63   );.  }..  switc
cac0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
cad0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
cae0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
caf0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79  inity;.      Key
cb00: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
cb10: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
cb20: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
cb30: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
cb40: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
cb50: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
cb60: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
cb70: 65 66 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eft;..      if( 
cb80: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a  rMayHaveNull ){.
cb90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cba0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cbb0: 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76  Null, 0, rMayHav
cbc0: 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  eNull);.      }.
cbd0: 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
cbe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
cbf0: 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20  inity(pLeft);.. 
cc00: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
cc10: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
cc20: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
cc30: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
cc40: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
cc50: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
cc60: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
cc70: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
cc80: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
cc90: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
cca0: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
ccb0: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
ccc0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
ccd0: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
cce0: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
ccf0: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
cd00: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
cd10: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
cd20: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
cd30: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
cd40: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
cd50: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
cd60: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
cd70: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
cd80: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
cd90: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
cda0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
cdb0: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
cdc0: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
cdd0: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
cde0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
cdf0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
ce00: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
ce10: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
ce20: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
ce30: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
ce40: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
ce50: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
ce60: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
ce70: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
ce80: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
ce90: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
cea0: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
ceb0: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
cec0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
ced0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
cee0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
cef0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
cf00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cf10: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
cf20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
cf30: 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  !isRowid);.     
cf40: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
cf50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
cf60: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
cf70: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
cf80: 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
cf90: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
cfa0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
cfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
cfc0: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
cfd0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
cfe0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
cff0: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
d000: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
d010: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
d020: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
d030: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
d040: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
d050: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
d060: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
d070: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
d080: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
d090: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
d0a0: 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
d0b0: 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
d0c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d0d0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
d0e0: 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
d0f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
d100: 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66          dest.aff
d110: 69 6e 69 74 79 20 3d 20 28 75 38 29 61 66 66 69  inity = (u8)affi
d120: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73  nity;.        as
d130: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
d140: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
d150: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
d160: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
d170: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d180: 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
d190: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
d1a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
d1b0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
d1c0: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
d1d0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
d1e0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
d1f0: 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
d200: 74 21 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e  t!=0 && pEList->
d210: 6e 45 78 70 72 3e 30 29 20 29 7b 20 0a 20 20 20  nExpr>0) ){ .   
d220: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
d230: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
d240: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
d250: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
d260: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
d270: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
d280: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
d290: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d2a0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
d2b0: 78 2e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  x.pList!=0 ){.  
d2c0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
d2d0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
d2e0: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
d2f0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
d300: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
d310: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
d320: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
d330: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
d340: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
d350: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
d360: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
d370: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
d380: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
d390: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
d3a0: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
d3b0: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
d3c0: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
d3d0: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
d3e0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
d3f0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
d400: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d410: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
d420: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
d430: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
d440: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
d450: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d460: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
d470: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
d480: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
d490: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
d4a0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
d4b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
d4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d4d0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
d4e0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
d4f0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d500: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
d510: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
d520: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
d530: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
d540: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
d550: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
d560: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
d570: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
d580: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
d590: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
d5a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d5b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
d5c0: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
d5d0: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
d5e0: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
d5f0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
d600: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
d610: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
d620: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
d630: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
d640: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d650: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
d660: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
d670: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
d680: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
d690: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
d6a0: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
d6b0: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
d6c0: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
d6d0: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
d6e0: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
d6f0: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
d700: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
d710: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
d720: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
d730: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
d740: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
d750: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
d760: 64 72 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  dr && !sqlite3Ex
d770: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
d780: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d790: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d7a0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
d7b0: 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20  Addr-1, 2);.    
d7c0: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
d7d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d7e0: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
d7f0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
d800: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
d810: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
d820: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
d830: 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
d840: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
d850: 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
d860: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
d870: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
d880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d890: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d8a0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 20  _MustBeInt, r3, 
d8b0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d8c0: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
d8d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d8e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d8f0: 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
d900: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
d910: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
d920: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
d930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d940: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
d950: 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
d960: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
d970: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d980: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
d990: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
d9a0: 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
d9b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d9c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
d9d0: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
d9e0: 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  able, r2);.     
d9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
da00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
da10: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
da20: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
da30: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
da40: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
da50: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
da60: 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77 69       if( !isRowi
da70: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  d ){.        sql
da80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
da90: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
daa0: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)&keyInfo, P4_K
dab0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
dac0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dad0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
dae0: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
daf0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
db00: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
db10: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73    /* If this has
db20: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
db30: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
db40: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
db50: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
db60: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
db70: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
db80: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
db90: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
dba0: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
dbb0: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20  ll in iColumn.  
dbc0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
dbd0: 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20  ISTS, write.    
dbe0: 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
dbf0: 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
dc00: 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e 74  r 1 (exists) int
dc10: 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a  o a memory cell.
dc20: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63        ** and rec
dc30: 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ord that memory 
dc40: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
dc50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dc60: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b  static const Tok
dc70: 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22 2c 20  en one = { "1", 
dc80: 31 20 7d 3b 20 20 2f 2a 20 54 6f 6b 65 6e 20 66  1 };  /* Token f
dc90: 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  or literal value
dca0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65   1 */.      Sele
dcb0: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
dce0: 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
dcf0: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
dd00: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd20: 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
dd30: 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74  th SELECt result
dd40: 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63   */..      testc
dd50: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
dd60: 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
dd70: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
dd80: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
dd90: 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
dda0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
ddb0: 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72  _EXISTS || pExpr
ddc0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
ddd0: 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
dde0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ddf0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
de00: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
de10: 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  pSel = pExpr->x.
de20: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73  pSelect;.      s
de30: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
de40: 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b  Init(&dest, 0, +
de50: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a  +pParse->nMem);.
de60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
de70: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
de80: 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
de90: 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
dea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
deb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dec0: 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50  Null, 0, dest.iP
ded0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
dee0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
def0: 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
df00: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
df10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
df20: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
df30: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
df40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
df50: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
df60: 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20  , dest.iParm);. 
df70: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
df80: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
df90: 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
dfa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
dfb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
dfc0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
dfd0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
dfe0: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
dff0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
e000: 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
e010: 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20  0, 0, &one);.   
e020: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
e030: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
e040: 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  l, &dest) ){.   
e050: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
e060: 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72     }.      pExpr
e070: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  ->iColumn = (i16
e080: 29 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20  )dest.iParm;.   
e090: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
e0a0: 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
e0b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e0c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74  .  }..  if( test
e0d0: 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Addr ){.    sqli
e0e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
e0f0: 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a  v, testAddr-1);.
e100: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
e110: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
e120: 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b  , 1);..  return;
e130: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e140: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e150: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
e160: 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
e170: 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
e180: 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
e190: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
e1a0: 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
e1b0: 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
e1c0: 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
e1d0: 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
e1e0: 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
e1f0: 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
e200: 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
e210: 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn out;.}../*.**
e220: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
e230: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
e240: 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
e250: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
e260: 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
e270: 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
e280: 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
e290: 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
e2a0: 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
e2b0: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
e2c0: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
e2d0: 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
e2e0: 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
e2f0: 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
e300: 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
e310: 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
e320: 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
e330: 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
e340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
e350: 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
e360: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
e370: 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
e380: 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
e390: 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
e3a0: 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
e3b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20  .    char *zV;. 
e3c0: 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
e3d0: 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 61  , &value);.    a
e3e0: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
e3f0: 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
e400: 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
e410: 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
e420: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
e430: 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
e440: 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20   -value;.    zV 
e450: 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
e460: 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
e470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e480: 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
e490: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
e4a0: 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
e4b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
e4c0: 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
e4d0: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
e4e0: 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
e4f0: 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
e500: 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
e510: 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
e520: 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
e530: 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
e540: 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
e550: 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
e560: 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
e570: 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
e580: 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
e590: 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
e5a0: 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
e5b0: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
e5c0: 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
e5d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
e5e0: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
e5f0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
e600: 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
e610: 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70 45 78 70  Mem){.  if( pExp
e620: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
e630: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
e640: 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
e650: 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 6e  Value;.    if( n
e660: 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
e670: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e680: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
e690: 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
e6a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
e6b0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
e6c0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
e6d0: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
e6e0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e6f0: 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c  3FitsIn64Bits(z,
e700: 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
e710: 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
e720: 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
e730: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
e740: 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
e750: 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
e760: 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
e770: 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  ;.      zV = dup
e780: 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
e790: 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
e7a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e7b0: 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
e7c0: 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
e7d0: 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
e7e0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52  lse{.      codeR
e7f0: 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
e800: 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  g, iMem);.    }.
e810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
e820: 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
e830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e840: 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
e850: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e860: 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
e870: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
e880: 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
e890: 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
e8a0: 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
e8b0: 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
e8c0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
e8d0: 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
e8e0: 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
e8f0: 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
e900: 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
e910: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
e920: 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
e930: 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
e940: 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
e950: 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
e960: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
e970: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
e980: 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
e990: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
e9a0: 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
e9b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e9c0: 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
e9d0: 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
e9e0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
e9f0: 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
ea00: 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
ea10: 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
ea20: 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
ea30: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
ea40: 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
ea50: 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
ea60: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
ea70: 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
ea80: 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
ea90: 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
eaa0: 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
eab0: 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
eac0: 74 72 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  try */.  for(i=0
ead0: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
eae0: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
eaf0: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
eb00: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
eb10: 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54 61  ->iReg && p->iTa
eb20: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e  ble==iTab && p->
eb30: 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b  iColumn==iCol ){
eb40: 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
eb50: 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
eb60: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  );.      p->iLev
eb70: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
eb80: 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
eb90: 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
eba0: 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e        p->affChan
ebb0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ge = 0;.      p-
ebc0: 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
ebd0: 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
ebe0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ebf0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61    }..  /* Find a
ec00: 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64  n empty slot and
ec10: 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20   replace it */. 
ec20: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
ec30: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
ec40: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
ec50: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
ec60: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
ec70: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  0 ){.      p->iL
ec80: 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
ec90: 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
eca0: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
ecb0: 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  ab;.      p->iCo
ecc0: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
ecd0: 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
ece0: 67 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 43  g;.      p->affC
ecf0: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
ed00: 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
ed10: 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
ed20: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
ed30: 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
ed40: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
ed50: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
ed60: 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
ed70: 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
ed80: 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
ed90: 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
eda0: 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
edb0: 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
edc0: 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
edd0: 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
ede0: 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
edf0: 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
ee00: 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
ee10: 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
ee20: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
ee30: 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
ee40: 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
ee50: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
ee60: 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
ee70: 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
ee80: 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
ee90: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
eea0: 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
eeb0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
eec0: 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
eed0: 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 30  p->affChange = 0
eee0: 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  ;.    p->tempReg
eef0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75   = 0;.    p->lru
ef00: 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
ef10: 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  eCnt++;.    retu
ef20: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
ef30: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
ef40: 20 72 65 67 69 73 74 65 72 20 69 73 20 62 65 69   register is bei
ef50: 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
ef60: 20 50 75 72 67 65 20 74 68 65 20 72 65 67 69 73   Purge the regis
ef70: 74 65 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ter.** from the 
ef80: 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
ef90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
efa0: 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72  rCacheRemove(Par
efb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
efc0: 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
efd0: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
efe0: 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
eff0: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
f000: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
f010: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
f020: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
f030: 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
f040: 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
f050: 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
f060: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
f070: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
f080: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
f090: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
f0a0: 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
f0b0: 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
f0c0: 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
f0d0: 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
f0e0: 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
f0f0: 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
f100: 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
f110: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
f120: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
f130: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f140: 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
f150: 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
f160: 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d  iCacheLevel++;.}
f170: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
f180: 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
f190: 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
f1a0: 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
f1b0: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
f1c0: 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73  e previous N Pus
f1d0: 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49  h operations.  I
f1e0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
f1f0: 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65  estore the cache
f200: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65  .** to the state
f210: 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73   it was in N Pus
f220: 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64  hes ago..*/.void
f230: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f240: 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
f250: 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  se, int N){.  in
f260: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
f270: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
f280: 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61  sert( N>0 );.  a
f290: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
f2a0: 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b  CacheLevel>=N );
f2b0: 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
f2c0: 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66  eLevel -= N;.  f
f2d0: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
f2e0: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
f2f0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
f300: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
f310: 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
f320: 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
f330: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
f340: 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
f350: 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
f360: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
f370: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f380: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
f390: 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
f3a0: 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
f3b0: 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
f3c0: 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
f3d0: 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
f3e0: 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
f3f0: 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
f400: 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
f410: 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
f420: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
f430: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
f440: 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
f450: 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
f460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f470: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f480: 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
f490: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f4a0: 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
f4b0: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
f4c0: 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
f4d0: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
f4e0: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
f4f0: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
f500: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
f510: 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
f520: 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
f530: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f540: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f550: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
f560: 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
f570: 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
f580: 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
f590: 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
f5a0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
f5b0: 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
f5c0: 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
f5d0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
f5e0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
f5f0: 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
f600: 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
f610: 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
f620: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
f630: 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
f640: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
f650: 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
f660: 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
f670: 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
f680: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
f690: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
f6a0: 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
f6b0: 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
f6c0: 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
f6d0: 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
f6e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f6f0: 65 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  e might attempt 
f700: 74 6f 20 72 65 75 73 65 20 74 68 65 20 76 61 6c  to reuse the val
f710: 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ue of the column
f720: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72   that.** has alr
f730: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
f740: 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
f750: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 77 69 6c  .  The value wil
f760: 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75  l always.** be u
f770: 73 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  sed if it has no
f780: 74 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20  t undergone any 
f790: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73  affinity changes
f7a0: 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20  .  But if.** an 
f7b0: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
f7c0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
f7d0: 65 6e 20 74 68 65 20 63 61 63 68 65 64 20 76 61  en the cached va
f7e0: 6c 75 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  lue will only be
f7f0: 0a 2a 2a 20 75 73 65 64 20 69 66 20 61 6c 6c 6f  .** used if allo
f800: 77 41 66 66 43 68 6e 67 20 69 73 20 74 72 75 65  wAffChng is true
f810: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f820: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
f830: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
f840: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
f850: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
f860: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
f870: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
f880: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
f890: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
f8a0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
f8b0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
f8c0: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
f8d0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
f8e0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
f8f0: 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
f900: 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
f910: 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
f920: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
f930: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
f940: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
f950: 20 69 6e 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e   int allowAffChn
f960: 67 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 69  g /* True if pri
f970: 6f 72 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  or affinity chan
f980: 67 65 73 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b  ges are OK */.){
f990: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
f9a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
f9b0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
f9c0: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
f9d0: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
f9e0: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
f9f0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
fa00: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
fa10: 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
fa20: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
fa30: 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
fa40: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
fa50: 20 20 20 20 20 20 26 26 20 28 21 70 2d 3e 61 66        && (!p->af
fa60: 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77  fChange || allow
fa70: 41 66 66 43 68 6e 67 29 20 29 7b 0a 20 20 20 20  AffChng) ){.    
fa80: 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
fa90: 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
faa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fab0: 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
fac0: 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
fad0: 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
fae0: 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
faf0: 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
fb00: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43  v!=0 );.  if( iC
fb10: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 73  olumn<0 ){.    s
fb20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fb30: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
fb40: 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d  able, iReg);.  }
fb50: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
fb60: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
fb70: 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
fb80: 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
fb90: 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
fba0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
fbb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
fbc0: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
fbd0: 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
fbe0: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
fbf0: 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d  (v, pTab, iColum
fc00: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20  n, iReg);.  }.  
fc10: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
fc20: 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
fc30: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
fc40: 52 65 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  Reg);.  return i
fc50: 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
fc60: 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
fc70: 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
fc80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
fc90: 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
fca0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
fcb0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
fcc0: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
fcd0: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
fce0: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
fcf0: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
fd00: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
fd10: 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a   if( p->iReg ){.
fd20: 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
fd30: 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
fd40: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
fd50: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
fd60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
fd70: 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
fd80: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
fd90: 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
fda0: 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
fdb0: 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
fdc0: 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
fdd0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
fde0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
fdf0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
fe00: 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
fe10: 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69  iCount){.  int i
fe20: 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
fe30: 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74  Count - 1;.  int
fe40: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
fe50: 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
fe60: 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
fe70: 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
fe80: 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
fe90: 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
fea0: 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
feb0: 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74 61 72      if( r>=iStar
fec0: 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a  t && r<=iEnd ){.
fed0: 20 20 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e        p->affChan
fee0: 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ge = 1;.    }.  
fef0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
ff00: 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
ff10: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
ff20: 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
ff30: 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
ff40: 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
ff50: 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
ff60: 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
ff70: 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
ff80: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
ff90: 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
ffa0: 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
ffb0: 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
ffc0: 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
ffd0: 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
ffe0: 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   *p;.  if( NEVER
fff0: 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72  (iFrom==iTo) ) r
10000 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
10010 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
10020 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
10030 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
10040 52 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Reg);.  for(i=0,
10050 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
10060 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
10070 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
10080 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  p++){.    int x 
10090 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
100a0 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78  f( x>=iFrom && x
100b0 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20  <iFrom+nReg ){. 
100c0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20       p->iReg += 
100d0 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d  iTo-iFrom;.    }
100e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
100f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
10100 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  opy content from
10110 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
10120 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
10130 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
10140 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76  iTo+nReg-1..*/.v
10150 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
10160 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70  odeCopy(Parse *p
10170 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
10180 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
10190 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
101a0 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d   if( NEVER(iFrom
101b0 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b  ==iTo) ) return;
101c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
101d0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  eg; i++){.    sq
101e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
101f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
10200 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c  P_Copy, iFrom+i,
10210 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a   iTo+i);.  }.}..
10220 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
10230 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
10240 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
10250 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
10260 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
10270 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
10280 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
10290 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
102a0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
102b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
102c0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
102d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
102e0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
102f0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
10300 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10310 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
10320 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
10330 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
10340 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
10350 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
10360 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  o ) return 1;.  
10370 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
10380 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
10390 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  st instruction c
103a0 6f 64 65 64 20 69 73 20 61 6e 20 65 70 68 65 6d  oded is an ephem
103b0 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79  eral copy of any
103c0 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67 69 73   of.** the regis
103d0 74 65 72 73 20 69 6e 20 74 68 65 20 6e 52 65 67  ters in the nReg
103e0 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
103f0 6e 69 6e 67 20 77 69 74 68 20 69 52 65 67 2c 20  ning with iReg, 
10400 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20  then.** convert 
10410 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63  the last instruc
10420 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f  tion from OP_SCo
10430 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a  py to OP_Copy..*
10440 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
10450 70 72 48 61 72 64 43 6f 70 79 28 50 61 72 73 65  prHardCopy(Parse
10460 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
10470 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
10480 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
10490 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
104a0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
104b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
104c0 29 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  );.  v = pParse-
104d0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
104e0 28 20 76 21 3d 30 20 29 3b 0a 20 20 70 4f 70 20  ( v!=0 );.  pOp 
104f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
10500 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 61 73 73  Op(v, -1);.  ass
10510 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20  ert( pOp!=0 );. 
10520 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
10530 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f  ==OP_SCopy && pO
10540 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70  p->p1>=iReg && p
10550 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67  Op->p1<iReg+nReg
10560 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63   ){.    pOp->opc
10570 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20  ode = OP_Copy;. 
10580 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
10590 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 6f  rate code to sto
105a0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
105b0 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c  the iAlias-th al
105c0 69 61 73 20 69 6e 20 72 65 67 69 73 74 65 72 0a  ias in register.
105d0 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  ** target.  The 
105e0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
105f0 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78 70 72  is called, pExpr
10600 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 74 6f   is evaluated to
10610 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
10620 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 69  value of the ali
10630 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  as.  The value i
10640 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
10650 75 78 69 6c 69 61 72 79 20 72 65 67 69 73 74 65  uxiliary registe
10660 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d  r.** and the num
10670 62 65 72 20 6f 66 20 74 68 61 74 20 72 65 67 69  ber of that regi
10680 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
10690 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74  .  On subsequent
106a0 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20 72   calls,.** the r
106b0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
106c0 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 6f  s returned witho
106d0 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  ut generating an
106e0 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  y code..**.** No
106f0 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64 65 72  te that in order
10700 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72   for this to wor
10710 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  k, code must be 
10720 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65  generated in the
10730 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72 20 74  .** same order t
10740 68 61 74 20 69 74 20 69 73 20 65 78 65 63 75 74  hat it is execut
10750 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65  ed..**.** Aliase
10760 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  s are numbered s
10770 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20  tarting with 1. 
10780 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20 69 6e   So iAlias is in
10790 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66   the range.** of
107a0 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e 41   1 to pParse->nA
107b0 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65 2e 20  lias inclusive. 
107c0 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   .**.** pParse->
107d0 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
107e0 20 72 65 63 6f 72 64 73 20 74 68 65 20 72 65 67   records the reg
107f0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
10800 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  re the value.** 
10810 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68  of the iAlias-th
10820 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72 65 64   alias is stored
10830 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68 61 74  .  If zero, that
10840 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a   means that the.
10850 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e 6f 74  ** alias has not
10860 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70 75 74   yet been comput
10870 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
10880 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61 72 73  t codeAlias(Pars
10890 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
108a0 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70 45 78  Alias, Expr *pEx
108b0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
108c0 0a 23 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33  .#if 0.  sqlite3
108d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
108e0 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a 20  b;.  int iReg;. 
108f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 41 6c   if( pParse->nAl
10900 69 61 73 41 6c 6c 6f 63 3c 70 50 61 72 73 65 2d  iasAlloc<pParse-
10910 3e 6e 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70  >nAlias ){.    p
10920 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20  Parse->aAlias = 
10930 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
10940 4f 72 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  OrFree(db, pPars
10950 65 2d 3e 61 41 6c 69 61 73 2c 0a 20 20 20 20 20  e->aAlias,.     
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
10980 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
10990 73 5b 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41  s[0])*pParse->nA
109a0 6c 69 61 73 20 29 3b 0a 20 20 20 20 74 65 73 74  lias );.    test
109b0 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
109c0 46 61 69 6c 65 64 20 26 26 20 70 50 61 72 73 65  Failed && pParse
109d0 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3e 30 20  ->nAliasAlloc>0 
109e0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
109f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
10a00 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 73  turn 0;.    mems
10a10 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 6c 69  et(&pParse->aAli
10a20 61 73 5b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  as[pParse->nAlia
10a30 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a 20 20 20 20  sAlloc], 0,.    
10a40 20 20 20 20 20 20 20 28 70 50 61 72 73 65 2d 3e         (pParse->
10a50 6e 41 6c 69 61 73 2d 70 50 61 72 73 65 2d 3e 6e  nAlias-pParse->n
10a60 41 6c 69 61 73 41 6c 6c 6f 63 29 2a 73 69 7a 65  AliasAlloc)*size
10a70 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
10a80 73 5b 30 5d 29 29 3b 0a 20 20 20 20 70 50 61 72  s[0]));.    pPar
10a90 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 20  se->nAliasAlloc 
10aa0 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  = pParse->nAlias
10ab0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10ac0 69 41 6c 69 61 73 3e 30 20 26 26 20 69 41 6c 69  iAlias>0 && iAli
10ad0 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 69  as<=pParse->nAli
10ae0 61 73 20 29 3b 0a 20 20 69 52 65 67 20 3d 20 70  as );.  iReg = p
10af0 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41  Parse->aAlias[iA
10b00 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66 28 20 69  lias-1];.  if( i
10b10 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Reg==0 ){.    if
10b20 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
10b30 4c 65 76 65 6c 3e 30 20 29 7b 0a 20 20 20 20 20  Level>0 ){.     
10b40 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
10b50 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
10b60 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
10b70 67 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  get);.    }else{
10b80 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20 2b 2b  .      iReg = ++
10b90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10ba0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10bb0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10bc0 72 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  r, iReg);.      
10bd0 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69  pParse->aAlias[i
10be0 41 6c 69 61 73 2d 31 5d 20 3d 20 69 52 65 67 3b  Alias-1] = iReg;
10bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10c00 75 72 6e 20 69 52 65 67 3b 0a 23 65 6c 73 65 0a  urn iReg;.#else.
10c10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10c20 45 52 28 69 41 6c 69 61 73 29 3b 0a 20 20 72 65  ER(iAlias);.  re
10c30 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
10c40 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
10c50 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
10c60 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
10c70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
10c80 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
10c90 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
10ca0 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
10cb0 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
10cc0 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
10cd0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
10ce0 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
10cf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
10d00 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
10d10 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
10d20 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
10d30 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
10d40 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
10d50 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
10d60 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
10d70 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
10d80 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
10d90 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
10da0 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
10db0 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
10dc0 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
10dd0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
10de0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
10df0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
10e00 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
10e10 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
10e20 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
10e30 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10e40 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
10e50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
10e60 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
10e70 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
10e80 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10e90 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
10ea0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10eb0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
10ee0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
10ef0 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
10f00 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
10f10 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
10f20 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
10f30 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
10f40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
10f50 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
10f60 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
10f70 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
10f80 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
10f90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
10fa0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
10fb0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
10fc0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
10fd0 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20   r2, r3, r4;    
10fe0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
10ff0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
11000 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
11010 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
11020 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
11030 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  nnection */..  a
11040 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
11050 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
11060 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
11070 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
11080 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
11090 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
110a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
110b0 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
110c0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
110d0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
110e0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
110f0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
11100 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
11110 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
11120 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
11130 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
11140 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
11150 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
11160 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
11170 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
11180 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
11190 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
111a0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
111b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
111c0 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
111d0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
111e0 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
111f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11200 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
11210 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
11220 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
11230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11240 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
11250 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
11260 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
11290 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
112a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
112b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
112c0 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
112d0 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
112e0 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
112f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11300 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
11310 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
11320 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
11330 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
11340 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
11350 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
11360 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
11370 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
11380 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20  kBase>0 );.     
11390 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
113a0 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
113b0 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
113c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
113d0 20 74 65 73 74 63 61 73 65 28 20 28 70 45 78 70   testcase( (pExp
113e0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e  r->flags & EP_An
113f0 79 41 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20  yAff)!=0 );.    
11400 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
11410 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
11420 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
11430 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
11460 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  ->iColumn, pExpr
11470 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
11480 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
114b0 26 20 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20  & EP_AnyAff);.  
114c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
114d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
114e0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
114f0 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
11500 72 28 76 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  r(v, pExpr, 0, t
11510 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
11520 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11530 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
11540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
11550 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11560 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
11570 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
11580 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
11590 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
115a0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
115b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
115c0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
115d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
115e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
115f0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
11600 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11610 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11620 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
11630 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
11640 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
11650 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11660 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
11670 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
11680 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11690 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
116a0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
116b0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
116c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
116d0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
116e0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
116f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
11700 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
11710 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
11720 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11730 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
11740 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
11750 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
11760 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
11770 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
11780 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
11790 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
117a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
117b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
117c0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
117d0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
117e0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
117f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11800 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
11810 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
11820 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
11830 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
11840 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
11850 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
11860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11870 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
11880 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
11890 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
118a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
118b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
118c0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
118d0 45 3a 20 7b 0a 20 20 20 20 20 20 56 64 62 65 4f  E: {.      VdbeO
118e0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 61 73  p *pOp;.      as
118f0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
11900 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
11910 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
11920 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
11930 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
11940 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11950 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
11960 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  0]!=0 );.      i
11970 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
11980 65 6e 5b 31 5d 3d 3d 30 0a 20 20 20 20 20 20 20  en[1]==0.       
11990 20 20 26 26 20 28 70 4f 70 20 3d 20 73 71 6c 69    && (pOp = sqli
119a0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
119b0 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
119c0 5f 56 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20  _Variable.      
119d0 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
119e0 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d 3e 69 43  p->p3==pExpr->iC
119f0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26  olumn.         &
11a00 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
11a10 33 3d 3d 74 61 72 67 65 74 0a 20 20 20 20 20 20  3==target.      
11a20 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d     && pOp->p4.z=
11a30 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
11a40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 72      /* If the pr
11a50 65 76 69 6f 75 73 20 69 6e 73 74 72 75 63 74 69  evious instructi
11a60 6f 6e 20 77 61 73 20 61 20 63 6f 70 79 20 6f 66  on was a copy of
11a70 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 75 6e   the previous un
11a80 6e 61 6d 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  named.        **
11a90 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74 6f 20   parameter into 
11aa0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 65 67  the previous reg
11ab0 69 73 74 65 72 2c 20 74 68 65 6e 20 73 69 6d 70  ister, then simp
11ac0 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ly increment the
11ad0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65  .        ** repe
11ae0 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20  at count on the 
11af0 70 72 69 6f 72 20 69 6e 73 74 72 75 63 74 69 6f  prior instructio
11b00 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20 6d 61  n rather than ma
11b10 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20 20 20 20  king a new.     
11b20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
11b30 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
11b40 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
11b50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11b70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 61  eAddOp3(v, OP_Va
11b80 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
11b90 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 2c 20  Column, target, 
11ba0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
11bb0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
11bc0 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
11bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11be0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 45  angeP4(v, -1, pE
11bf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
11c00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11c10 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11c30 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
11c40 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
11c50 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
11c60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11c70 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
11c80 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
11c90 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65  codeAlias(pParse
11ca0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
11cb0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
11cc0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
11cd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
11ce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
11cf0 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
11d00 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
11d10 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
11d20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
11d30 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
11d40 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
11d50 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
11d60 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
11d70 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
11d80 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
11d90 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
11da0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
11db0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
11dc0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
11dd0 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
11de0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
11df0 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
11e00 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70  en);.      to_op
11e10 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f   = aff - SQLITE_
11e20 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f  AFF_TEXT + OP_To
11e30 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Text;.      asse
11e40 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
11e50 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d  Text    || aff!=
11e60 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
11e70 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
11e80 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
11e90 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
11ea0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
11eb0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
11ec0 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
11ed0 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d  Numeric || aff!=
11ee0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11ef0 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  IC );.      asse
11f00 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
11f10 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d  Int     || aff!=
11f20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
11f30 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ER );.      asse
11f40 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
11f50 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
11f60 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11f70 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74     );.      test
11f80 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
11f90 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20  ToText );.      
11fa0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
11fb0 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20  =OP_ToBlob );.  
11fc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
11fd0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
11fe0 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c );.      testc
11ff0 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
12000 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  oInt );.      te
12010 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
12020 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20  P_ToReal );.    
12030 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
12040 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
12050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12060 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
12070 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
12080 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
12090 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
120a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
120b0 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
120c0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65  inReg);.      te
120d0 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
120e0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
120f0 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
12100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12110 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
12120 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
12130 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
12140 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12150 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12160 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
12170 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
12180 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
12190 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
121a0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
121b0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
121c0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
121d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
121e0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
121f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
12200 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
12210 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
12220 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
12230 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
12240 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
12250 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
12260 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12270 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
12280 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12290 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
122a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
122b0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
122c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
122d0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
122e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
122f0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
12300 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
12310 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12320 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
12330 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
12340 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
12350 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12360 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
123a0 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
123b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
123c0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
123d0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
123e0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12400 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
12410 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
12420 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12430 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
12440 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
12450 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
12460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12470 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
12480 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
12490 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
124a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
124b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
124c0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
124d0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
124e0 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
124f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
12500 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
12510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
12540 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
12550 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
12560 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
12570 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
12580 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
12590 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
125a0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
125b0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
125c0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
125d0 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
125e0 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f  TOREP2 | SQLITE_
125f0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
12600 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
12610 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
12620 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
12630 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
12640 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
12650 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
12660 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
12670 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
12680 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
12690 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
126a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
126b0 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
126c0 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
126d0 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
126e0 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
126f0 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
12700 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
12710 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
12720 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
12730 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
12740 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20  ==OP_And );.    
12750 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
12760 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20  =OP_Or );.      
12770 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
12780 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20  =OP_Add );.     
12790 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
127a0 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
127b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
127c0 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
127d0 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73  nder );.      as
127e0 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
127f0 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20  =OP_BitAnd );.  
12800 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
12810 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
12820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12830 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
12840 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ide );.      ass
12850 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
12860 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
12870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12880 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
12890 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  tRight );.      
128a0 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
128b0 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a  T==OP_Concat );.
128c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
128d0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
128e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
128f0 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
12900 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12910 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
12920 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12930 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
12940 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12950 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65  _REM );.      te
12960 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
12970 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74  ITAND );.      t
12980 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12990 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  BITOR );.      t
129a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
129b0 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74  SLASH );.      t
129c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
129d0 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
129e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
129f0 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
12a00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12a10 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
12a20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
12a30 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
12a40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
12a50 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
12a60 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
12a70 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
12a80 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
12a90 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
12aa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12ab0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
12ac0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
12ad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12ae0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
12af0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
12b00 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
12b10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12b20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
12b30 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
12b40 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
12b50 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
12b60 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
12b70 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
12b80 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
12b90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12ba0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
12bb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
12bc0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
12bd0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
12be0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
12bf0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
12c00 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
12c10 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
12c20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
12c30 74 65 67 65 72 28 76 2c 20 70 4c 65 66 74 2c 20  teger(v, pLeft, 
12c40 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
12c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12c60 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d   regFree1 = r1 =
12c70 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12c80 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
12c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ca0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12cb0 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20  ger, 0, r1);.   
12cc0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
12cd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
12ce0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
12cf0 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
12d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12d10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12d20 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
12d30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12d40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
12d50 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
12d60 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
12d70 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
12d80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12d90 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
12da0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
12db0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
12dc0 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
12dd0 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  BitNot );.      
12de0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
12df0 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  OP_Not );.      
12e00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12e10 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
12e20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12e30 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
12e40 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
12e50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
12e60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
12e70 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
12e80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
12e90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  e1==0 );.      i
12ea0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
12eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12ec0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
12ed0 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
12ee0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12ef0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
12f00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
12f10 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
12f20 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73  t addr;.      as
12f30 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
12f40 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
12f50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
12f60 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
12f70 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ll );.      test
12f80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
12f90 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
12fa0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
12fb0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
12fc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12fd0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12fe0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
12ff0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
13000 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13010 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13020 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
13030 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
13040 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
13050 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13060 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
13070 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
13080 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13090 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
130a0 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  get, -1);.      
130b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
130c0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
130d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
130e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
130f0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
13100 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66     AggInfo *pInf
13110 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
13120 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
13130 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
13140 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
13150 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
13160 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
13170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13180 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13190 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
131a0 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20  gregate: %s()", 
131b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
131c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
131d0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
131e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
131f0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
13200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13210 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13220 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
13230 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
13240 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
13250 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
13260 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
13270 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
13280 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
13290 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
132a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
132b0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
132c0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
132d0 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
132e0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
132f0 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
13300 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
13310 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
13320 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
13330 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
13340 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a   name in bytes *
13350 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
13360 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
13370 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
13380 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ame */.      int
13390 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
133a0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
133b0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
133c0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
133d0 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
133e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
133f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13400 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ter */.      u8 
13410 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
13420 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
13430 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
13440 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
13450 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
13460 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
13470 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
13480 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
13490 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
134a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
134b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
134c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
134d0 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46  ( op==TK_CONST_F
134e0 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UNC );.      tes
134f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55  tcase( op==TK_FU
13500 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
13510 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
13520 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
13530 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
13540 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
13550 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13560 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
13570 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
13580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
13590 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
135a0 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
135b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
135c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
135d0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
135e0 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
135f0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13600 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71  ;.      nId = sq
13610 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
13620 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  d);.      pDef =
13630 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
13640 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49  tion(db, zId, nI
13650 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
13660 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
13670 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
13680 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13690 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
136a0 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28   function: %.*s(
136b0 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  )", nId, zId);. 
136c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
136d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
136e0 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
136f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
13700 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13710 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
13720 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
13730 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
13740 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
13750 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
13760 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13770 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
13780 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
13790 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
137a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
137b0 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20 2f  (pParse, 1);   /
137c0 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
137d0 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d  d34be */.      }
137e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
137f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
13800 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13810 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13820 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
13830 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
13840 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
13850 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
13860 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
13870 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
13880 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13890 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
138a0 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
138b0 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
138c0 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
138d0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
138e0 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
138f0 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
13900 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
13910 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
13920 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
13930 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
13940 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
13950 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
13960 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
13970 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
13980 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
13990 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
139a0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
139b0 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
139c0 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
139d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
139e0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
139f0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
13a00 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
13a10 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
13a20 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
13a30 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
13a40 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
13a50 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
13a60 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
13a70 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
13a80 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
13a90 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
13aa0 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
13ab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13ac0 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28  f( nFarg>=2 && (
13ad0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
13ae0 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
13af0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
13b00 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
13b10 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
13b20 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
13b30 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  g->a[1].pExpr);.
13b40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13b50 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20  nFarg>0 ){.     
13b60 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
13b70 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
13b80 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
13b90 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
13ba0 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
13bb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13bc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
13bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13be0 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
13bf0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
13c00 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
13c10 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
13c20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28    constMask |= (
13c30 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
13c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
13c50 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
13c60 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
13c70 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
13c80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
13c90 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13ca0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13cb0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
13cc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13cd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
13ce0 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
13cf0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
13d00 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
13d10 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
13d20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
13d30 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
13d40 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13d50 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
13d60 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
13d70 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
13d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13da0 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
13db0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
13dc0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13de0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
13df0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
13e00 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13e10 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
13e20 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
13e30 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
13e40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13e50 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
13e60 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
13e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13e80 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
13e90 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
13ea0 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
13eb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13ec0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13ed0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
13ee0 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
13ef0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
13f00 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
13f10 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
13f20 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
13f30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
13f40 43 54 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  CT );.      sqli
13f50 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
13f60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
13f70 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 52  0, 0);.      inR
13f80 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
13f90 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  umn;.      break
13fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13fb0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
13fc0 69 6e 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20  int rNotFound = 
13fd0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61  0;.      int rMa
13fe0 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
13ff0 20 20 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c       int j2, j3,
14000 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63   j4, j5;.      c
14010 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
14020 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a      int eType;..
14030 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
14040 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
14050 20 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74   IN expr r%d", t
14060 61 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65  arget));.      e
14070 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
14080 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
14090 2c 20 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61  , pExpr, &rMayHa
140a0 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69  veNull);.      i
140b0 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
140c0 29 7b 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46  ){.        rNotF
140d0 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ound = ++pParse-
140e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a  >nMem;.      }..
140f0 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
14100 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
14110 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
14120 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
14130 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
14140 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
14150 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
14160 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
14170 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
14180 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34   for.      ** P4
14190 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
141a0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
141b0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
141c0 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
141d0 70 45 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20  pExpr);...      
141e0 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
141f0 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
14200 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
14210 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
14220 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
14230 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
14240 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
14250 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
14260 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
14270 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14280 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
14290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
142a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
142b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
142c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 6a 32  arget);.      j2
142d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
142e0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
142f0 6c 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  l, target);.    
14300 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
14310 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
14320 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69         j3 = sqli
14330 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14340 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74   OP_MustBeInt, t
14350 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
14360 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
14370 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
14380 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69  Exists, pExpr->i
14390 54 61 62 6c 65 2c 20 30 2c 20 74 61 72 67 65 74  Table, 0, target
143a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
143b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
143c0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
143d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
143e0 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j5 = sqlite3Vdbe
143f0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
14400 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
14410 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14420 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20 20  v, j3);.        
14430 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14440 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20  ere(v, j4);.    
14450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14470 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ger, 0, target);
14480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14490 20 20 20 20 20 20 72 32 20 3d 20 72 65 67 46 72        r2 = regFr
144a0 65 65 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ee2 = sqlite3Get
144b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
144c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65  ..        /* Cre
144d0 61 74 65 20 61 20 72 65 63 6f 72 64 20 61 6e 64  ate a record and
144e0 20 74 65 73 74 20 66 6f 72 20 73 65 74 20 6d 65   test for set me
144f0 6d 62 65 72 73 68 69 70 2e 20 49 66 20 74 68 65  mbership. If the
14500 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20   set contains.  
14510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
14520 75 65 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ue, then jump to
14530 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
14540 74 65 73 74 20 63 6f 64 65 2e 20 54 68 65 20 74  test code. The t
14550 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  arget.        **
14560 20 72 65 67 69 73 74 65 72 20 73 74 69 6c 6c 20   register still 
14570 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72 75  contains the tru
14580 65 20 28 31 29 20 76 61 6c 75 65 20 77 72 69 74  e (1) value writ
14590 74 65 6e 20 74 6f 20 69 74 20 65 61 72 6c 69 65  ten to it earlie
145a0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
145b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
145c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
145d0 6b 65 52 65 63 6f 72 64 2c 20 74 61 72 67 65 74  keRecord, target
145e0 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
145f0 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
14600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14610 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14620 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
14630 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65       j5 = sqlite
14640 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14650 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
14660 69 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a  iTable, 0, r2);.
14670 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
14680 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
14690 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
146a0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
146b0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
146c0 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
146d0 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
146e0 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
146f0 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
14700 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
14710 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  s no NULL values
14720 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
14730 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73  t is 0. If the s
14740 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  et .        ** c
14750 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
14760 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ore NULL values,
14770 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
14780 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
14790 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
147a0 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20   also NULL..    
147b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
147c0 66 28 20 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20  f( rNotFound==0 
147d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
147e0 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
147f0 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
14800 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
14810 28 6e 6f 77 29 20 74 68 61 74 20 0a 20 20 20 20  (now) that .    
14820 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 74        ** the set
14830 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
14840 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
14850 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
14860 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 2a  sult.          *
14870 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
14880 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
14890 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
148a0 65 6d 61 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20  ema. No need.   
148b0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
148c0 74 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  t the data struc
148d0 74 75 72 65 20 61 74 20 72 75 6e 74 69 6d 65 20  ture at runtime 
148e0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
148f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14910 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14920 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
14930 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14940 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
14950 69 73 20 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74  is block populat
14960 65 73 20 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64  es the rNotFound
14970 20 72 65 67 69 73 74 65 72 20 77 69 74 68 20 65   register with e
14980 69 74 68 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20  ither NULL.     
14990 20 20 20 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e       ** or 0 (an
149a0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 2e   integer value).
149b0 20 49 66 20 74 68 65 20 64 61 74 61 20 73 74 72   If the data str
149c0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
149d0 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  one.          **
149e0 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20   or more NULLs, 
149f0 74 68 65 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75  then set rNotFou
14a00 6e 64 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65  nd to NULL. Othe
14a10 72 77 69 73 65 2c 20 73 65 74 20 69 74 0a 20 20  rwise, set it.  
14a20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e          ** to 0.
14a30 20 49 66 20 72 65 67 69 73 74 65 72 20 72 4d 61   If register rMa
14a40 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72  yHaveNull is alr
14a50 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65  eady set to some
14a60 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
14a70 20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 4e   ** other than N
14a80 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ULL, then the te
14a90 73 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  st has already b
14aa0 65 65 6e 20 72 75 6e 20 61 6e 64 20 0a 20 20 20  een run and .   
14ab0 20 20 20 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f         ** rNotFo
14ac0 75 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 70  und is already p
14ad0 6f 70 75 6c 61 74 65 64 2e 0a 20 20 20 20 20 20  opulated..      
14ae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
14af0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
14b00 61 72 20 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20  ar nullRecord[] 
14b10 3d 20 7b 20 30 78 30 32 2c 20 30 78 30 30 20 7d  = { 0x02, 0x00 }
14b20 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 33 20 3d  ;.          j3 =
14b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b40 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
14b50 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
14b60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14b70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14b80 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74  OP_Null, 0, rNot
14b90 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Found);.        
14ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bb0 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
14bc0 32 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  2, rMayHaveNull,
14bd0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 6e 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34    nullRecord, P4
14c00 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
14c10 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33      j4 = sqlite3
14c20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14c30 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
14c40 54 61 62 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61  Table, 0, rMayHa
14c50 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  veNull);.       
14c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14c70 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14c80 65 72 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64  er, 0, rNotFound
14c90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14ca0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14cb0 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20  (v, j4);.       
14cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14cd0 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a  mpHere(v, j3);..
14ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
14cf0 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  y the value of r
14d00 65 67 69 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e  egister rNotFoun
14d10 64 20 28 77 68 69 63 68 20 69 73 20 65 69 74 68  d (which is eith
14d20 65 72 20 4e 55 4c 4c 20 6f 72 20 30 29 0a 20 20  er NULL or 0).  
14d30 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20          ** into 
14d40 74 68 65 20 74 61 72 67 65 74 20 72 65 67 69 73  the target regis
14d50 74 65 72 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ter. This will b
14d60 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  e the result of 
14d70 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
14d80 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20   expression..   
14d90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14da0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14db0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
14dc0 2c 20 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 72  , rNotFound, tar
14dd0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  get);.        }.
14de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14df0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14e00 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20  e(v, j2);.      
14e10 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14e20 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20  ere(v, j5);.    
14e30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14e40 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
14e50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
14e60 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
14e70 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65  expr r%d", targe
14e80 74 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  t));.      break
14e90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
14ea0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
14eb0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
14ec0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
14ed0 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
14ee0 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
14ef0 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
14f00 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
14f10 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
14f20 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
14f30 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
14f40 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
14f50 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
14f60 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
14f70 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
14f80 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
14f90 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
14fa0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
14fb0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
14fc0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
14fd0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
14fe0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
14ff0 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  em = pExpr->x.pL
15000 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
15010 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
15020 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
15030 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70     codeCompareOp
15040 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70  erands(pParse, p
15050 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
15060 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2c 20          pRight, 
15090 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
150a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
150b0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
150c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150d0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
150e0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
150f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
15100 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
15110 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15120 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15130 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
15140 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
15150 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
15170 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
15180 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
15190 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
151a0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
151b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
151c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
151d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
151e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
151f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15200 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
15210 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
15220 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15230 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
15240 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
15250 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
15260 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
15270 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
15280 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
15290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
152a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c  ddOp3(v, OP_And,
152b0 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29   r3, r4, target)
152c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
152d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
152e0 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20  arse, r3);.     
152f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15300 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15310 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
15320 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15330 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
15340 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
15350 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
15360 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15370 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
15380 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15390 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
153a0 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
153b0 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
153c0 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
153d0 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
153e0 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
153f0 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
15400 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
15410 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
15420 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
15430 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
15440 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
15450 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
15460 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
15470 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
15480 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
15490 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
154a0 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
154b0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
154c0 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
154d0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
154e0 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
154f0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
15500 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
15510 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
15520 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
15530 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
15540 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
15550 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
15560 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
15570 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
15580 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
15590 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
155a0 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
155b0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
155c0 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
155d0 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
155e0 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
155f0 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
15600 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
15610 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
15620 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
15630 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
15640 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
15650 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
15660 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
15670 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
15680 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
15690 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
156a0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
156b0 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
156c0 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
156d0 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
156e0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
156f0 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
15700 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
15710 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
15720 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
15730 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
15740 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
15750 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
15760 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
15770 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
15780 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
15790 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
157a0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
157b0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
157c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
157d0 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
157e0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
157f0 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
15800 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
15810 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
15820 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
15830 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
15840 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
15850 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
15860 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
15870 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
15880 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
15890 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
158a0 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
158b0 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
158c0 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
158d0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
158e0 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
158f0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
15900 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
15910 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
15920 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
15930 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
15940 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
15950 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
15960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
15970 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
15980 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
15990 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
159a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
159b0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
159c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
159d0 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
159e0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
159f0 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
15a00 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
15a10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15a20 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
15a30 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
15a40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
15a50 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
15a60 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
15a70 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
15a80 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
15a90 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
15aa0 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
15ab0 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
15ac0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
15ad0 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
15ae0 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
15af0 20 20 20 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a     ));..      /*
15b00 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
15b10 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
15b20 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
15b30 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
15b40 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
15b50 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
15b60 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
15b70 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
15b80 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20  ly real.  */.   
15b90 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
15ba0 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
15bb0 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
15bc0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
15bd0 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
15be0 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
15bf0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15c00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15c10 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
15c20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
15c30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15c40 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
15c50 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
15c60 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
15c70 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
15c80 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
15c90 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
15ca0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
15cb0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
15cc0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
15cd0 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
15ce0 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
15cf0 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
15d00 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
15d10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
15d20 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
15d30 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
15d40 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
15d50 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
15d60 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
15d70 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
15d80 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
15d90 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
15da0 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
15db0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
15dc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
15dd0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
15de0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
15df0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
15e00 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  in pExpr->pRight
15e10 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
15e20 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
15e30 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a  here is no.    *
15e40 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e  * ELSE clause an
15e50 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20  d no other term 
15e60 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68  matches, then th
15e70 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
15e80 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e      ** exprssion
15e90 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
15ea0 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
15eb0 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
15ec0 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
15ed0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
15ee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15ef0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
15f00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
15f10 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
15f20 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
15f30 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
15f40 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
15f50 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
15f60 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
15f70 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
15f80 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
15f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
15fa0 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
15fb0 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
15fc0 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
15fd0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
15fe0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
15ff0 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
16000 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
16010 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
16040 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
16050 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
16060 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
16090 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
160a0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
160d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
160e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
160f0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
16100 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
16110 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
16120 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
16130 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
16140 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
16150 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
16160 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
16170 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
16180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
16190 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
161a0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61 63  /.      Expr cac
161b0 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  heX;            
161c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
161d0 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58  hed expression X
161e0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
161f0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
16200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16210 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
16220 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
16230 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
16240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
16250 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
16260 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
16270 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   */.      VVA_ON
16280 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65  LY( int iCacheLe
16290 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
162a0 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20  acheLevel; )..  
162b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
162c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
162d0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
162e0 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ) && pExpr->x.pL
162f0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ist );.      ass
16300 65 72 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c  ert((pExpr->x.pL
16310 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
16320 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
16330 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ert(pExpr->x.pLi
16340 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
16350 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
16360 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
16370 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
16380 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
16390 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
163a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
163b0 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
163c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
163d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
163e0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
163f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
16400 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20  acheX = *pX;.   
16410 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16420 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  X->op==TK_COLUMN
16430 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
16440 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
16450 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
16460 20 20 20 20 20 63 61 63 68 65 58 2e 69 54 61 62       cacheX.iTab
16470 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
16480 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16490 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b   pX, &regFree1);
164a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
164b0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
164c0 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58  ;.        cacheX
164d0 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  .op = TK_REGISTE
164e0 52 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  R;.        opCom
164f0 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
16500 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
16510 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68  re.pLeft = &cach
16520 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  eX;.        pTes
16530 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
16540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
16550 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
16560 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
16570 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16580 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
16590 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
165a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
165b0 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
165c0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
165d0 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
165e0 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
165f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16600 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
16610 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
16620 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
16630 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
16640 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16650 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16660 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
16670 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
16680 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
16690 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
166a0 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
166b0 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
166c0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
166d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
166e0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
166f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
16700 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  N );.        tes
16710 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
16720 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
16730 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
16740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16750 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
16760 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
16770 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
16780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16790 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
167a0 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c  oto, 0, endLabel
167b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
167c0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
167d0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
167e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
167f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
16800 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
16810 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
16820 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
16830 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16840 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
16850 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16860 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
16870 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16880 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16890 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
168a0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
168b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
168c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
168d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
168e0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
168f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
16900 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
16910 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
16920 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
16930 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
16940 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
16950 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
16960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16970 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
16980 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
16990 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
169a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
169b0 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
169c0 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
169d0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
169e0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
169f0 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
16a00 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
16a10 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
16a20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
16a30 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
16a40 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
16a50 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
16a60 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
16a70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
16a80 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
16a90 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
16aa0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16ab0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
16ae0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
16af0 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
16b00 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
16b10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
16b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
16b30 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
16b40 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
16b50 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
16b60 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
16b70 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
16b80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16b90 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16ba0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
16bb0 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
16bc0 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
16bd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16be0 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
16bf0 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
16c00 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
16c10 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
16c20 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
16c30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
16c50 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
16c60 73 65 2c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  se, pExpr->affin
16c70 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
16c80 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
16c90 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
16ca0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
16cb0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
16cc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16cd0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
16ce0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16cf0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
16d00 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
16d10 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
16d20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16d30 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
16d40 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
16d50 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
16d60 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
16d70 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
16d80 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
16d90 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
16da0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
16db0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
16dc0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
16dd0 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
16de0 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
16df0 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
16e00 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
16e10 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
16e20 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
16e30 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
16e40 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
16e50 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
16e60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16e70 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
16e80 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
16e90 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
16ea0 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  eg){.  int r1 = 
16eb0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16ec0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
16ed0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16ee0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
16ef0 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
16f00 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
16f10 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
16f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
16f30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16f40 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
16f50 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
16f60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
16f70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
16f80 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
16f90 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
16fa0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
16fb0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
16fc0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
16fd0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
16fe0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
16ff0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
17000 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
17010 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  get..*/.int sqli
17020 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
17030 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17040 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
17050 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
17060 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
17070 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
17080 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
17090 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  .  inReg = sqlit
170a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
170b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
170c0 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
170d0 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
170e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
170f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
17100 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
17110 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
17120 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Vdbe ){.    sqli
17130 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
17140 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
17150 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
17160 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rget);.  }.  ret
17170 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f  urn target;.}../
17180 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17190 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73  de that evalutes
171a0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
171b0 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
171c0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
171d0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
171e0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
171f0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
17200 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
17210 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
17220 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
17230 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
17240 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
17250 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
17260 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
17270 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
17280 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
17290 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
172a0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
172b0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
172c0 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
172d0 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
172e0 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
172f0 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
17300 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
17310 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
17320 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
17330 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74  e reused..*/.int
17340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17350 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
17360 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
17370 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
17380 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
17390 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
173a0 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65  nt inReg;.  inRe
173b0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
173c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
173d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
173e0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
173f0 3b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ;.  /* This rout
17400 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
17410 72 20 74 65 72 6d 73 20 74 6f 20 49 4e 53 45 52  r terms to INSER
17420 54 20 6f 72 20 55 50 44 41 54 45 2e 20 20 41 6e  T or UPDATE.  An
17430 64 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  d the only.  ** 
17440 6f 74 68 65 72 20 70 6c 61 63 65 20 77 68 65 72  other place wher
17450 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  e expressions ca
17460 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  n be converted i
17470 6e 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20  nto TK_REGISTER 
17480 69 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52 45  is.  ** in WHERE
17490 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
174a0 6e 67 2e 20 20 53 6f 20 61 73 20 63 75 72 72 65  ng.  So as curre
174b0 6e 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ntly implemented
174c0 2c 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  , there is.  ** 
174d0 6e 6f 20 77 61 79 20 66 6f 72 20 61 20 54 4b 5f  no way for a TK_
174e0 52 45 47 49 53 54 45 52 20 74 6f 20 65 78 69 73  REGISTER to exis
174f0 74 20 68 65 72 65 2e 20 20 42 75 74 20 69 74 20  t here.  But it 
17500 73 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74 6f  seems prudent to
17510 0a 20 20 2a 2a 20 6b 65 65 70 20 74 68 65 20 41  .  ** keep the A
17520 4c 57 41 59 53 28 29 20 69 6e 20 63 61 73 65 20  LWAYS() in case 
17530 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  the conditions a
17540 62 6f 76 65 20 63 68 61 6e 67 65 20 77 69 74 68  bove change with
17550 20 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64   future.  ** mod
17560 69 66 69 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e  ifications or en
17570 68 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20  hancements. */. 
17580 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
17590 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
175a0 45 52 29 20 29 7b 20 20 0a 20 20 20 20 69 6e 74  ER) ){  .    int
175b0 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20   iMem;.    iMem 
175c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
175d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
175e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
175f0 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29  py, inReg, iMem)
17600 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
17610 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20  ble = iMem;.    
17620 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78  pExpr->op2 = pEx
17630 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70  pr->op;.    pExp
17640 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
17650 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TER;.  }.  retur
17660 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
17670 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
17680 20 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e   pExpr is an con
17690 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
176a0 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
176b0 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74  iate.** for fact
176c0 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c  oring out of a l
176d0 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74  oop.  Appropriat
176e0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
176f0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41  e:.**.**    *  A
17700 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
17710 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  at evaluates to 
17720 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f  two or more opco
17730 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  des..**.**    * 
17740 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c   Any OP_Integer,
17750 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72   OP_Real, OP_Str
17760 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50  ing, OP_Blob, OP
17770 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20  _Null, .**      
17780 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20   or OP_Variable 
17790 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
177a0 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
177b0 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73  in a .**       s
177c0 70 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72  pecific register
177d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
177e0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63   no point in fac
177f0 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c  toring out singl
17800 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f  e-instruction co
17810 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73  nstant.** expres
17820 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20  sions that need 
17830 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
17840 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
17850 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63  ister.  .** We c
17860 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d  ould factor them
17870 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77   out, but then w
17880 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61  e would end up a
17890 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53  dding an.** OP_S
178a0 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e  Copy instruction
178b0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
178c0 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72  ue into the corr
178d0 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ect register.** 
178e0 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74  later.  We might
178f0 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73   as well just us
17900 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  e the original i
17910 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a  nstruction and.*
17920 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53  * avoid the OP_S
17930 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Copy..*/.static 
17940 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74  int isAppropriat
17950 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78  eForFactoring(Ex
17960 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73  pr *p){.  if( !s
17970 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
17980 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29  tantNotJoin(p) )
17990 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
179a0 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e   /* Only constan
179b0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  t expressions ar
179c0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
179d0 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20  r factoring */. 
179e0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61   }.  if( (p->fla
179f0 67 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73  gs & EP_FixedDes
17a00 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
17a10 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63  urn 1;  /* Any c
17a20 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20  onstant without 
17a30 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
17a40 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61  ion is appropria
17a50 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c  te */.  }.  whil
17a60 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
17a70 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66  US ) p = p->pLef
17a80 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  t;.  switch( p->
17a90 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  op ){.#ifndef SQ
17aa0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
17ab0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
17ac0 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a  TK_BLOB:.#endif.
17ad0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
17ae0 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  ABLE:.    case T
17af0 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
17b00 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
17b10 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
17b20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
17b30 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  NG: {.      test
17b40 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17b50 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65  BLOB );.      te
17b60 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17b70 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20  K_VARIABLE );.  
17b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
17b90 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
17ba0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17bb0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  e( p->op==TK_FLO
17bc0 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AT );.      test
17bd0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17be0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
17bf0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17c00 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20  K_STRING );.    
17c10 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74    /* Single-inst
17c20 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
17c30 73 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64  s with a fixed d
17c40 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20  estination are. 
17c50 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64       ** better d
17c60 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66  one in-line.  If
17c70 20 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c   we factor them,
17c80 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20   they will just 
17c90 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20  end.      ** up 
17ca0 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50  generating an OP
17cb0 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74  _SCopy to move t
17cc0 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20  he value to the 
17cd0 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20  destination.    
17ce0 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a    ** register. *
17cf0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
17d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17d10 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
17d20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
17d30 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
17d40 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  | p->pLeft->op==
17d50 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
17d60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
17d80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
17d90 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
17da0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
17db0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
17dc0 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  /*.** If pExpr i
17dd0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
17de0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
17df0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
17e00 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74  ** factoring out
17e10 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e   of a loop, then
17e20 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   evaluate the ex
17e30 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f  pression.** into
17e40 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20   a register and 
17e50 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72  convert the expr
17e60 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b  ession into a TK
17e70 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78 70  _REGISTER.** exp
17e80 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ression..*/.stat
17e90 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74  ic int evalConst
17ea0 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  Expr(Walker *pWa
17eb0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
17ec0 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  r){.  Parse *pPa
17ed0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
17ee0 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68 28  Parse;.  switch(
17ef0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
17f00 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
17f10 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
17f20 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
17f30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
17f40 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
17f50 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
17f60 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
17f70 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20  CONST_FUNC: {.  
17f80 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d      /* The argum
17f90 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74 69  ents to a functi
17fa0 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65 64 20  on have a fixed 
17fb0 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20  destination..   
17fc0 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20     ** Mark them 
17fd0 74 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f 69  this way to avoi
17fe0 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e 65  d generated unne
17ff0 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20  eded OP_SCopy.  
18000 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
18010 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ons. .      */. 
18020 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
18030 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
18040 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pList;.      ass
18050 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
18060 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18070 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
18080 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
18090 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
180a0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
180b0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
180c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
180d0 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  em = pList->a;. 
180e0 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30         for(; i>0
180f0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
18100 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 41  .          if( A
18110 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70 45 78  LWAYS(pItem->pEx
18120 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70 45 78  pr) ) pItem->pEx
18130 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  pr->flags |= EP_
18140 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20 20  FixedDest;.     
18150 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18170 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70 72    }.  if( isAppr
18180 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72  opriateForFactor
18190 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ing(pExpr) ){.  
181a0 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61    int r1 = ++pPa
181b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
181c0 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d 20  nt r2;.    r2 = 
181d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
181e0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
181f0 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
18200 28 20 4e 45 56 45 52 28 72 31 21 3d 72 32 29 20  ( NEVER(r1!=r2) 
18210 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
18220 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18230 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r1);.    pExpr->
18240 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b  op2 = pExpr->op;
18250 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
18260 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
18270 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
18280 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e  = r2;.    return
18290 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
182a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
182b0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
182c0 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73  Preevaluate cons
182d0 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69  tant subexpressi
182e0 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72  ons within pExpr
182f0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
18300 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
18310 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20  isters.  Modify 
18320 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68  pExpr so that th
18330 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78  e constant subex
18340 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  presions.** are 
18350 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f  TK_REGISTER opco
18360 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  des that refer t
18370 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65  o the precompute
18380 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69  d values..*/.voi
18390 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
183a0 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65  eConstants(Parse
183b0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
183c0 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
183d0 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
183e0 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73  lback = evalCons
183f0 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65  tExpr;.  w.xSele
18400 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
18410 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
18420 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
18430 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
18440 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  );.}.../*.** Gen
18450 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
18460 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
18470 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
18480 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
18490 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
184a0 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
184b0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
184c0 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
184d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
184e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
184f0 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
18500 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
18510 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
18520 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
18530 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
18540 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18550 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
18560 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
18570 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
18580 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
18590 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
185a0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
185b0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
185c0 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20   doHardCopy     
185d0 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63  /* Make a hard c
185e0 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65  opy of every ele
185f0 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ment */.){.  str
18600 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
18610 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
18620 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  i, n;.  assert( 
18630 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
18640 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
18650 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  ;.  n = pList->n
18660 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
18670 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
18680 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
18690 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  ++){.    if( pIt
186a0 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20  em->iAlias ){.  
186b0 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63      int iReg = c
186c0 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c  odeAlias(pParse,
186d0 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20   pItem->iAlias, 
186e0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61  pItem->pExpr, ta
186f0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56  rget+i);.      V
18700 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
18710 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
18720 0a 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21  .      if( iReg!
18730 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
18740 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18750 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
18760 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74  py, iReg, target
18770 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
18780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
18790 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
187a0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
187b0 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
187c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48     }.    if( doH
187d0 61 72 64 43 6f 70 79 20 26 26 20 21 70 50 61 72  ardCopy && !pPar
187e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
187f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
18800 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70  lite3ExprHardCop
18810 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  y(pParse, target
18820 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , n);.    }.  }.
18830 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
18840 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
18850 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
18860 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
18870 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
18880 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
18890 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
188a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
188b0 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
188c0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
188d0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
188e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
188f0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
18900 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
18910 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
18920 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
18930 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
18940 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
18950 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
18960 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
18970 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
18980 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
18990 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
189a0 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
189b0 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
189c0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
189d0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
189e0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
189f0 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
18a00 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
18a10 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
18a20 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
18a30 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
18a40 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
18a50 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
18a60 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
18a70 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
18a80 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
18a90 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
18aa0 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
18ab0 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
18ac0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
18ad0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
18ae0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
18af0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
18b00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
18b10 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
18b20 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
18b30 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
18b40 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
18b50 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
18b60 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
18b70 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
18b80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
18b90 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
18ba0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
18bb0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
18bc0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
18bd0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
18be0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
18bf0 20 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f    /* Existance o
18c00 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
18c10 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
18c20 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
18c30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
18c40 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
18c50 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
18c60 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
18c70 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
18c80 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
18c90 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
18ca0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18cb0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
18cc0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
18cd0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
18ce0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
18cf0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
18d00 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
18d10 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
18d20 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
18d30 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
18d40 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
18d50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18d60 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
18d70 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
18d80 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
18d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18da0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18db0 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
18dc0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
18dd0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
18de0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18df0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
18e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18e10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
18e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
18e30 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
18e40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
18e50 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
18e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18e70 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
18e80 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
18e90 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
18ea0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
18eb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18ec0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
18ed0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
18ee0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
18ef0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
18f00 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
18f10 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
18f20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
18f30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18f40 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
18f50 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
18f60 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
18f70 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
18f80 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
18f90 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
18fa0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18fb0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
18fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
18fd0 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
18fe0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
18ff0 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
19000 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
19010 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
19020 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
19030 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
19040 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
19050 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Ne );.      test
19060 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
19070 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19080 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
19090 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
190a0 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
190b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
190c0 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
190d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
190e0 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
190f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
19100 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19110 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
19120 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  0 );.      codeC
19130 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70  ompareOperands(p
19140 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19150 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72  eft, &r1, &regFr
19160 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ee1,.           
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52         pExpr->pR
19190 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46  ight, &r2, &regF
191a0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
191b0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
191c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
191d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
191e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
191f0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
19200 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
19210 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
19220 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
19230 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
19240 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
19250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19260 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
19270 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
19280 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
19290 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
192a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
192b0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
192c0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
192d0 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
192e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
192f0 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
19300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
19330 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
19340 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
19350 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
19360 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
19370 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
19380 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
19390 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
193a0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
193b0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
193c0 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
193d0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
193e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
193f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
19400 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
19410 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
19420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19430 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
19440 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
19450 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
19460 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
19470 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
19480 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
19490 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
194a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
194b0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
194c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
194d0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
194e0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
194f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19500 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
19510 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
19520 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
19530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19540 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
19550 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
19560 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
19570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19580 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
19590 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
195a0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
195b0 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20  AND z.      **. 
195c0 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76       ** Is equiv
195d0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
195e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78  **.      **    x
195f0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
19600 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43     **.      ** C
19610 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
19620 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
19630 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
19640 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
19650 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e   ** elementation
19660 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a   of x..      */.
19670 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72 41        Expr exprA
19680 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  nd;.      Expr c
19690 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ompLeft;.      E
196a0 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20  xpr compRight;. 
196b0 20 20 20 20 20 45 78 70 72 20 65 78 70 72 58 3b       Expr exprX;
196c0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
196d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
196e0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
196f0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 65  lect) );.      e
19700 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
19710 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
19720 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
19730 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
19740 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
19750 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
19760 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
19770 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  ght;.      compL
19780 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
19790 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
197a0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
197b0 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52       compLeft.pR
197c0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
197d0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
197e0 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  r;.      compRig
197f0 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
19800 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19810 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
19820 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19830 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
19840 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
19850 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e  pr;.      exprX.
19860 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
19870 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19880 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
19890 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
198a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
198b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  1==0 );.      ex
198c0 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
198d0 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74  STER;.      test
198e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
198f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
19900 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
19910 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
19920 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
19930 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
19940 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
19950 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
19960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19970 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
19980 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
19990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
199a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
199b0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
199c0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
199d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
199e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
199f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
19a00 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
19a10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19a20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
19a30 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19a40 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
19a50 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19a60 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19a70 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
19a80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19a90 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
19aa0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
19ab0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
19ac0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
19ad0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
19ae0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
19af0 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
19b00 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
19b10 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
19b20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
19b30 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
19b40 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
19b50 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
19b60 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
19b70 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
19b80 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
19b90 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
19ba0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
19bb0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
19bc0 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
19bd0 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
19be0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
19bf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19c00 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
19c10 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
19c20 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
19c30 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19c40 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
19c50 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
19c60 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
19c70 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
19c80 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
19c90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
19ca0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
19cb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
19cc0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
19cd0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
19ce0 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
19cf0 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
19d00 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
19d10 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
19d20 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
19d30 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
19d40 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
19d50 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
19d60 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
19d70 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
19d80 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
19d90 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
19da0 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
19db0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
19dc0 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
19dd0 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
19de0 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
19df0 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
19e00 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
19e10 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
19e20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
19e30 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
19e40 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
19e50 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
19e60 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
19e70 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
19e80 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
19e90 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
19ea0 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
19eb0 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
19ec0 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
19ed0 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
19ee0 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
19ef0 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
19f00 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
19f10 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
19f20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
19f30 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
19f40 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
19f50 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
19f60 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
19f70 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
19f80 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
19f90 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
19fa0 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
19fb0 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
19fc0 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
19fd0 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
19fe0 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
19ff0 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
1a000 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
1a010 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
1a020 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
1a030 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
1a040 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
1a050 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1a060 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
1a070 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
1a080 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1a090 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
1a0a0 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
1a0b0 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
1a0c0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1a0d0 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
1a0e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1a0f0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
1a100 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
1a110 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a120 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
1a130 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
1a140 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1a150 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
1a160 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1a170 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
1a180 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
1a190 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1a1a0 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
1a1b0 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
1a1c0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1a1d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1a1e0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
1a1f0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1a200 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1a210 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1a220 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a230 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1a240 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1a250 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1a260 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1a270 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1a280 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1a290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a2a0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1a2b0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1a2c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a2d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1a2e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1a2f0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1a300 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a310 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1a320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a330 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1a340 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1a350 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1a360 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1a370 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a380 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1a390 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1a3a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1a3b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a3c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a3d0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1a3e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1a3f0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1a400 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a410 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1a420 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1a430 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1a440 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1a450 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1a460 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1a470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a480 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1a490 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1a4a0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1a4b0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1a4c0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1a4d0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1a4e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1a4f0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
1a500 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45  tcase( op==TK_LE
1a510 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a520 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  se( op==TK_GT );
1a530 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a540 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
1a550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1a560 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
1a570 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1a580 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
1a590 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1a5a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ll==0 );.      c
1a5b0 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e  odeCompareOperan
1a5c0 64 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ds(pParse, pExpr
1a5d0 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72  ->pLeft, &r1, &r
1a5e0 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20  egFree1,.       
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1a610 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26  ->pRight, &r2, &
1a620 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1a630 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1a640 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1a650 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1a660 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1a670 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1a680 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1a690 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a6a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1a6b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a6c0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1a6d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a6e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1a6f0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1a700 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1a710 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1a720 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1a730 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1a740 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1a750 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
1a760 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
1a770 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1a780 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
1a790 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
1a7c0 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
1a7d0 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
1a7e0 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
1a7f0 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
1a800 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _EQ;.      codeC
1a810 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1a820 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1a830 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a850 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1a860 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
1a870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a880 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1a890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1a8a0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1a8b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a8c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1a8d0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1a8e0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1a8f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1a900 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1a910 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1a920 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
1a930 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1a940 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a950 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1a960 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1a970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a980 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1a990 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
1a9a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1a9b0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
1a9c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a9d0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1a9e0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78   {.      /*    x
1a9f0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1aa00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1aa10 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74  ** Is equivalent
1aa20 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20   to .      **.  
1aa30 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
1aa40 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a  ND x<=z.      **
1aa50 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69  .      ** Code i
1aa60 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
1aa70 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
1aa80 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
1aa90 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65  ssion.      ** e
1aaa0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
1aab0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1aac0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20   Expr exprAnd;. 
1aad0 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65       Expr compLe
1aae0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  ft;.      Expr c
1aaf0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
1ab00 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20  Expr exprX;..   
1ab10 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ab20 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ab30 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ab40 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 20   );.      exprX 
1ab50 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
1ab60 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f  .      exprAnd.o
1ab70 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
1ab80 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
1ab90 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  = &compLeft;.   
1aba0 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68     exprAnd.pRigh
1abb0 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
1abc0 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f        compLeft.o
1abd0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20  p = TK_GE;.     
1abe0 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
1abf0 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
1ac00 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
1ac10 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1ac20 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1ac30 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70      compRight.op
1ac40 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20   = TK_LE;.      
1ac50 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
1ac60 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
1ac70 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
1ac80 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1ac90 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1aca0 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c       exprX.iTabl
1acb0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
1acc0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1acd0 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
1ace0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1acf0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1ad00 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f  );.      exprX.o
1ad10 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1ad20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ad30 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1ad40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ad50 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1ad60 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1ad70 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ad80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ad90 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
1ada0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
1adb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1adc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1add0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1ade0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1adf0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
1ae00 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
1ae10 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
1ae20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ae30 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ae40 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1ae50 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ae60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ae70 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1ae80 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1ae90 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1aea0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1aeb0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1aec0 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
1aed0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
1aee0 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
1aef0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
1af00 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
1af10 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65  -zero).** if the
1af20 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
1af30 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
1af40 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
1af50 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
1af60 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
1af70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1af80 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20  turn FALSE even 
1af90 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1afa0 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
1afb0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
1afc0 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
1afd0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
1afe0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
1aff0 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
1b000 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74  eturn FALSE just
1b010 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
1b020 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
1b030 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73  .** returns fals
1b040 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  e, then you do n
1b050 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
1b060 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
1b070 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
1b080 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
1b090 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
1b0a0 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e  et a TRUE return
1b0b0 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
1b0c0 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
1b0d0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
1b0e0 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
1b0f0 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
1b100 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b110 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
1b120 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
1b130 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74   extra FALSE - t
1b140 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
1b150 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
1b160 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
1b170 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
1b180 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
1b190 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64  rrect TRUE could
1b1a0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
1b1b0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1b1c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1b1d0 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
1b1e0 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
1b1f0 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
1b200 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b210 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 61   pB==pA;.  }.  a
1b220 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1b230 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  nyProperty(pA, E
1b240 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1b250 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73  educed) );.  ass
1b260 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1b270 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1b280 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1b290 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45  uced) );.  if( E
1b2a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b2b0 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  A, EP_xIsSelect)
1b2c0 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
1b2d0 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65  rty(pB, EP_xIsSe
1b2e0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
1b2f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1b300 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1b310 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
1b320 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
1b330 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  inct) ) return 0
1b340 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  ;.  if( pA->op!=
1b350 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
1b360 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
1b370 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
1b380 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
1b390 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
1b3a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1b3b0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
1b3c0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
1b3d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
1b3e0 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20  if( pA->x.pList 
1b3f0 26 26 20 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29  && pB->x.pList )
1b400 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 78 2e  {.    if( pA->x.
1b410 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42  pList->nExpr!=pB
1b420 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1b430 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1b440 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
1b450 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  x.pList->nExpr; 
1b460 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
1b470 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 78   *pExprA = pA->x
1b480 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
1b490 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  pr;.      Expr *
1b4a0 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 78 2e 70  pExprB = pB->x.p
1b4b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1b4c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  ;.      if( !sql
1b4d0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1b4e0 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20  pExprA, pExprB) 
1b4f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1b500 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41  }.  }else if( pA
1b510 2d 3e 78 2e 70 4c 69 73 74 20 7c 7c 20 70 42 2d  ->x.pList || pB-
1b520 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
1b530 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1b540 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
1b550 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70  =pB->iTable || p
1b560 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
1b570 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
1b580 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
1b590 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  sProperty(pA, EP
1b5a0 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20  _IntValue) ){.  
1b5b0 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
1b5c0 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e  operty(pB, EP_In
1b5d0 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75  tValue) || pA->u
1b5e0 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69  .iValue!=pB->u.i
1b5f0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
1b600 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1b610 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f   }else if( pA->o
1b620 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
1b630 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
1b640 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1b650 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49  roperty(pB, EP_I
1b660 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45  ntValue) || NEVE
1b670 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d  R(pB->u.zToken==
1b680 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
1b690 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1b6a0 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  rICmp(pA->u.zTok
1b6b0 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
1b6c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
1b6d0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1b6e0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1b6f0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1b700 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1b710 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1b720 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
1b730 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1b740 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
1b750 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
1b760 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
1b770 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
1b780 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
1b790 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
1b7a0 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
1b7b0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
1b7c0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
1b7d0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1b7e0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
1b7f0 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
1b800 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
1b810 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
1b820 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
1b830 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
1b840 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
1b850 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c  pInfo->nColumnAl
1b860 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
1b870 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
1b880 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
1b890 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1b8a0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
1b8b0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
1b8c0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1b8d0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
1b8e0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
1b8f0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1b900 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
1b910 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1b920 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
1b930 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
1b940 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
1b950 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
1b960 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
1b970 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1b980 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
1b990 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
1b9a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
1b9b0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
1b9c0 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
1b9d0 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
1b9e0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
1b9f0 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  uncAlloc,.      
1ba00 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
1ba10 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
1ba20 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
1ba30 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
1ba40 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
1ba50 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
1ba60 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
1ba70 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1ba80 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
1ba90 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1baa0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
1bab0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
1bac0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
1bad0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1bae0 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
1baf0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
1bb00 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
1bb10 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
1bb20 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
1bb30 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
1bb40 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
1bb50 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
1bb60 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
1bb70 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
1bb80 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1bb90 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
1bba0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
1bbb0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
1bbc0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1bbd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1bbe0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
1bbf0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1bc00 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1bc10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bc20 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1bc30 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1bc40 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1bc50 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
1bc60 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
1bc70 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
1bc80 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
1bc90 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
1bca0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
1bcb0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
1bcc0 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
1bcd0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1bce0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bcf0 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
1bd00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1bd10 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
1bd20 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1bd30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
1bd40 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1bd50 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
1bd60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1bd70 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
1bd80 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
1bd90 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1bda0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1bdb0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
1bdc0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
1bdd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1bde0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1bdf0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
1be00 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
1be10 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
1be20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
1be30 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1be40 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
1be50 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
1be60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
1be70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
1be80 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
1be90 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
1bea0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
1beb0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
1bec0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
1bed0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
1bee0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
1bef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1bf00 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
1bf10 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
1bf20 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
1bf30 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1bf40 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
1bf50 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
1bf60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1bf70 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
1bf80 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
1bf90 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1bfa0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
1bfb0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
1bfc0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
1bfd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bfe0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1bff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c000 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
1c010 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1c020 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
1c030 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
1c040 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
1c050 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
1c060 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
1c070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c080 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
1c090 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
1c0a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
1c0b0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
1c0c0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
1c0d0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
1c0e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1c100 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
1c110 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
1c120 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1c130 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
1c140 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1c150 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1c160 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1c180 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
1c190 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1c1a0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
1c1b0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
1c1c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
1c1d0 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
1c1e0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1c1f0 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
1c200 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
1c210 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1c220 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c230 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1c250 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1c270 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
1c280 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1c2a0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
1c2b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1c2c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
1c2d0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1c2e0 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
1c2f0 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
1c320 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
1c330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c340 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
1c350 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
1c360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c370 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1c3b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1c3c0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
1c3d0 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1c3f0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1c400 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
1c410 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1c430 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1c440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
1c450 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
1c460 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
1c470 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1c480 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
1c490 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
1c4a0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
1c4b0 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
1c4c0 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
1c4d0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
1c4e0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
1c4f0 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
1c500 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
1c510 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
1c520 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
1c530 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
1c540 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
1c550 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
1c560 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
1c570 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
1c580 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
1c590 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
1c5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
1c5b0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
1c5c0 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
1c5d0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
1c5e0 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
1c5f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c600 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
1c610 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
1c620 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
1c630 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
1c640 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
1c650 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
1c660 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
1c670 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1c680 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1c690 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1c6a0 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44    /* The pNC->nD
1c6b0 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75  epth==0 test cau
1c6c0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1c6d0 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75  nctions in subqu
1c6e0 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  eries.      ** t
1c6f0 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a  o be ignored */.
1c700 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e        if( pNC->n
1c710 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Depth==0 ){.    
1c720 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1c730 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
1c740 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
1c750 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
1c760 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
1c770 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
1c780 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
1c790 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
1c7a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1c7b0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1c7c0 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
1c7d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1c7e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1c7f0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1c800 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
1c810 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1c820 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1c830 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
1c840 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20  r, pExpr) ){.   
1c850 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c880 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
1c890 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1c8a0 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
1c8b0 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
1c8c0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
1c8d0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
1c8e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1c8f0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
1c900 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
1c910 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
1c920 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
1c930 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
1c940 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
1c950 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
1c960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1c970 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c980 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c990 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
1c9a0 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
1c9b0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1c9d0 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
1c9e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1c9f0 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
1ca00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1ca10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ca20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ca30 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1ca40 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1ca50 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
1ca60 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1ca70 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
1ca80 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1ca90 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
1caa0 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74  Token, sqlite3St
1cab0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
1cac0 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20  zToken),.       
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1cae0 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
1caf0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1cb00 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
1cb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1cb20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
1cb30 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1cb50 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1cb60 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1cb80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1cb90 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
1cba0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
1cbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cbc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1cbd0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
1cbe0 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
1cbf0 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
1cc00 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
1cc10 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
1cc20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1cc30 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1cc40 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1cc50 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1cc60 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
1cc70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
1cc80 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1cc90 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
1cca0 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
1ccb0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
1ccc0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1ccd0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1cce0 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
1ccf0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1cd00 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
1cd10 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1cd20 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1cd30 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
1cd40 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
1cd50 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  lect){.  NameCon
1cd60 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
1cd70 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66  ker->u.pNC;.  if
1cd80 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
1cd90 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
1cda0 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  pth++;.    sqlit
1cdb0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1cdc0 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
1cdd0 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
1cde0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  -;.    return WR
1cdf0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65  C_Prune;.  }else
1ce00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1ce10 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
1ce20 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1ce30 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1ce40 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1ce50 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1ce60 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1ce70 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1ce80 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1ce90 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1cea0 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1ceb0 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1cec0 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1ced0 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1cee0 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1cef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1cf00 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1cf10 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1cf20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1cf30 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1cf40 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
1cf50 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
1cf60 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1cf70 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1cf80 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1cf90 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1cfa0 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
1cfb0 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
1cfc0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
1cfd0 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
1cfe0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1cff0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1d000 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
1d010 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
1d020 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
1d030 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
1d040 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
1d050 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
1d060 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
1d070 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1d080 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
1d090 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
1d0a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
1d0b0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
1d0c0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1d0d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1d0e0 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
1d0f0 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
1d100 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
1d110 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1d120 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
1d130 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
1d140 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
1d150 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1d160 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d170 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1d180 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
1d190 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1d1a0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1d1b0 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
1d1c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1d1d0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1d1e0 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
1d1f0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
1d200 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
1d210 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
1d220 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
1d230 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
1d240 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
1d250 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
1d260 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
1d270 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1d280 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1d290 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
1d2a0 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
1d2b0 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
1d2c0 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
1d2d0 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
1d2e0 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
1d2f0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
1d300 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
1d310 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
1d320 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
1d330 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
1d340 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
1d350 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
1d360 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
1d370 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
1d380 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c  then.** the dall
1d390 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
1d3a0 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
1d3b0 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
1d3c0 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
1d3d0 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
1d3e0 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
1d3f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1d400 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
1d410 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
1d420 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
1d430 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
1d440 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
1d450 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
1d460 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
1d470 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1d480 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
1d490 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1d4a0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1d4b0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1d4c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1d4d0 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
1d4e0 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
1d4f0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
1d500 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1d510 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1d520 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1d530 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1d540 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
1d550 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
1d560 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
1d570 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
1d580 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
1d590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1d5a0 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
1d5b0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
1d5c0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
1d5d0 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
1d5e0 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
1d5f0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1d600 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
1d610 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f 6c 75  n && !usedAsColu
1d620 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
1d630 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20 20 20  i, i+n-1) ){.   
1d640 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
1d650 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
1d660 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1d670 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
1d680 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
1d690 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1d6a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1d6b0 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
1d6c0 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
1d6d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1d6e0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
1d6f0 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
1d700 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e  t nReg){.  if( n
1d710 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
1d720 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
1d730 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
1d740 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
1d750 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
1d760 52 65 67 3b 0a 20 20 7d 0a 7d 0a                 Reg;.  }.}.