/ Hex Artifact Content
Login

Artifact 24a8f8088d2af202852bac0a364614d20d5e663c:


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 28 6f 70 3d  op;.    if( (op=
0b90: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0ba0: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0bb0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0bc0: 45 52 29 20 26 26 20 70 2d 3e 70 54 61 62 21 3d  ER) && p->pTab!=
0bd0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70  0 ){.      /* op
0be0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
0bf0: 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70   p->pTab!=0 happ
0c00: 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77  ens when pExpr w
0c10: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
0c20: 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55      ** a TK_COLU
0c30: 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69  MN but was previ
0c40: 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20  ously evaluated 
0c50: 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20  and cached in a 
0c60: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
0c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
0c80: 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  oll;.      int j
0c90: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
0ca0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b       if( j>=0 ){
0cb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
0cc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0cd0: 62 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  b;.        zColl
0ce0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
0cf0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
0d00: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
0d10: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
0d20: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
0d30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45  , 0);.        pE
0d40: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f  xpr->pColl = pCo
0d50: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
0d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0d70: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 43 41     if( op!=TK_CA
0d80: 53 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55 50 4c  ST && op!=TK_UPL
0d90: 55 53 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  US ){.      brea
0da0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  k;.    }.    p =
0db0: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20   p->pLeft;.  }. 
0dc0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
0dd0: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
0de0: 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20   pColl) ){ .    
0df0: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
0e00: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
0e10: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0e20: 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61   an operand of a
0e30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0e40: 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74  ator.  aff2 is t
0e50: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0e60: 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ity of the other
0e70: 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
0e80: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0e90: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
0ea0: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0eb0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0ec0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0ed0: 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  ator..*/.char sq
0ee0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0ef0: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0f00: 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20  , char aff2){.  
0f10: 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69  char aff1 = sqli
0f20: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
0f30: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66  pExpr);.  if( af
0f40: 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20  f1 && aff2 ){.  
0f50: 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20    /* Both sides 
0f60: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
0f70: 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49  n are columns. I
0f80: 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69  f one has numeri
0f90: 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74  c.    ** affinit
0fa0: 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68  y, use that. Oth
0fb0: 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66  erwise use no af
0fc0: 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
0fd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
0fe0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
0ff0: 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33  aff1) || sqlite3
1000: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1010: 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20  y(aff2) ){.     
1020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1030: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
1040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1050: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1060: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
1070: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
1080: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
1090: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
10a0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
10b0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
10c0: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
10d0: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
10e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
10f0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1100: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1110: 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73    /* One side is
1120: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f   a column, the o
1130: 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65  ther is not. Use
1140: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66   the columns aff
1150: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73  inity. */.    as
1160: 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c  sert( aff1==0 ||
1170: 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20   aff2==0 );.    
1180: 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61  return (aff1 + a
1190: 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ff2);.  }.}../*.
11a0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
11b0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
11c0: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74  r.  Return the t
11d0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
11e0: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61  t should.** be a
11f0: 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f  pplied to both o
1200: 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f  perands prior to
1210: 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61   doing the compa
1220: 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  rison..*/.static
1230: 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e   char comparison
1240: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
1250: 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66  Expr){.  char af
1260: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f;.  assert( pEx
1270: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
1280: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1290: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  N || pExpr->op==
12a0: 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LT ||.       
12b0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
12c0: 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GT || pExpr->op
12d0: 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72  ==TK_GE || pExpr
12e0: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20  ->op==TK_LE ||. 
12f0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1300: 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 61  op==TK_NE );.  a
1310: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1320: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1330: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1340: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1350: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1360: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1370: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1380: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1390: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
13a0: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
13b0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13c0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
13d0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
13e0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13f0: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
1400: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1410: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1420: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1430: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1440: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1470: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1480: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1490: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
14a0: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
14b0: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
14c0: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
14d0: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
14e0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
14f0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
1500: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1510: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1520: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1530: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1540: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1550: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1560: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1570: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1580: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1590: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
15a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
15b0: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
15c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15d0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20  _AFF_NONE:.     
15e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
15f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1600: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1610: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1620: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1630: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1640: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1650: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1660: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1680: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1690: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
16a0: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
16b0: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
16c0: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
16d0: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
16e0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
16f0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1700: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1710: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1720: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1730: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1740: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1750: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
1760: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1770: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
1780: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
1790: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
17a0: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
17b0: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
17c0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
17d0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
17e0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
17f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1800: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1810: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1820: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1830: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1840: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1860: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1870: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1880: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1890: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
18a0: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
18b0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
18c0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
18d0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
18e0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
18f0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1900: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1910: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1920: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1930: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
1940: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
1950: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1960: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1970: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1980: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1990: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
19a0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
19b0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
19c0: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
19d0: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
19e0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
19f0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
1a00: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
1a10: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
1a20: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1a30: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1a40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a50: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Left->pColl );. 
1a60: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74     pColl = pLeft
1a70: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65  ->pColl;.  }else
1a80: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
1a90: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1aa0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
1ab0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
1ac0: 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ht->pColl );.   
1ad0: 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d   pColl = pRight-
1ae0: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b  >pColl;.  }else{
1af0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1b00: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1b10: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
1b20: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1b30: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
1b40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1b50: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1b60: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b70: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1b80: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b90: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72  the operands for
1ba0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1bb0: 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65  eration.  Before
1bc0: 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74  .** generating t
1bd0: 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68  he code for each
1be0: 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68   operand, set th
1bf0: 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66  e EP_AnyAff.** f
1c00: 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65  lag on the expre
1c10: 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ssion so that it
1c20: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1c30: 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65   used a.** cache
1c40: 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74  d column value t
1c50: 68 61 74 20 68 61 73 20 70 72 65 76 69 6f 75 73  hat has previous
1c60: 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a  ly undergone an.
1c70: 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  ** affinity chan
1c80: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1c90: 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70  id codeCompareOp
1ca0: 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20  erands(.  Parse 
1cb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1cc0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1cd0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1ce0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1cf0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d00: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d10: 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74  .  int *pRegLeft
1d20: 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ,    /* Register
1d30: 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72   where left oper
1d40: 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f  and is stored */
1d50: 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66  .  int *pFreeLef
1d60: 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69  t,   /* Free thi
1d70: 73 20 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s register when 
1d80: 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  done */.  Expr *
1d90: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1da0: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1db0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52   */.  int *pRegR
1dc0: 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73  ight,   /* Regis
1dd0: 74 65 72 20 77 68 65 72 65 20 72 69 67 68 74 20  ter where right 
1de0: 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65  operand is store
1df0: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65  d */.  int *pFre
1e00: 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74  eRight   /* Writ
1e10: 65 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 20  e temp register 
1e20: 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e  for right operan
1e30: 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  d there */.){.  
1e40: 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70  while( pLeft->op
1e50: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65  ==TK_UPLUS ) pLe
1e60: 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66  ft = pLeft->pLef
1e70: 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67  t;.  pLeft->flag
1e80: 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a  s |= EP_AnyAff;.
1e90: 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71    *pRegLeft = sq
1ea0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1eb0: 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1ec0: 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77   pFreeLeft);.  w
1ed0: 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70  hile( pRight->op
1ee0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69  ==TK_UPLUS ) pRi
1ef0: 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c  ght = pRight->pL
1f00: 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66  eft;.  pRight->f
1f10: 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66  lags |= EP_AnyAf
1f20: 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20  f;.  *pRegRight 
1f30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f40: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
1f50: 69 67 68 74 2c 20 70 46 72 65 65 52 69 67 68 74  ight, pFreeRight
1f60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1f70: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1f80: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1f90: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
1fa0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
1fb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1fc0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1fd0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
1fe0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
1ff0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2000: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2010: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2020: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2030: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2040: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2050: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2060: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2070: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2080: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2090: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
20a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
20b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
20c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
20d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
20e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
20f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2100: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2110: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2120: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2130: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2140: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2150: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2160: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2170: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2180: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2190: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
21a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
21b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
21c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
21e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
21f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2220: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2230: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2240: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2250: 28 75 38 29 70 35 29 3b 0a 20 20 69 66 28 20 28  (u8)p5);.  if( (
2260: 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f  p5 & SQLITE_AFF_
2270: 4d 41 53 4b 29 21 3d 53 51 4c 49 54 45 5f 41 46  MASK)!=SQLITE_AF
2280: 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71  F_NONE ){.    sq
2290: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
22a0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
22b0: 72 73 65 2c 20 69 6e 31 2c 20 31 29 3b 0a 20 20  rse, in1, 1);.  
22c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22d0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
22e0: 28 70 50 61 72 73 65 2c 20 69 6e 32 2c 20 31 29  (pParse, in2, 1)
22f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2300: 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ddr;.}..#if SQLI
2310: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2320: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
2330: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
2340: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
2350: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
2360: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
2370: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
2380: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
2390: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
23a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
23b0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
23c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
23d0: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
23e0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
23f0: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
2400: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2410: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
2420: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
2430: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
2440: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
2450: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2480: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
2490: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
24a0: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
24b0: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
24c0: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
24d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
24e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24f0: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
2500: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
2510: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
2520: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
2530: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
2540: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2550: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
2560: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
2570: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
2580: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
2590: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
25a0: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
25b0: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
25c0: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
25d0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
25e0: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
25f0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2600: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
2610: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
2620: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
2630: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
2640: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
2650: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
2660: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
2670: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
2680: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
2690: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
26a0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
26b0: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
26c0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
26d0: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
26e0: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
26f0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2700: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2710: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
2720: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
2730: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
2740: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
2750: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
2760: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
2770: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
2780: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
2790: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
27a0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
27b0: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
27c0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
27d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
27e0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
27f0: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
2800: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2810: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
2820: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
2830: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2840: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
2850: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2860: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
2870: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2880: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2890: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
28a0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
28b0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
28c0: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
28d0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
28e0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
28f0: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
2900: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2910: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
2920: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
2930: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2940: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2950: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
2960: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
2970: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
2980: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
2990: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
29a0: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
29b0: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
29c0: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
29d0: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
29e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
29f0: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
2a00: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2a10: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2a20: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
2a30: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
2a40: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2a50: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
2a60: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
2a70: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2a80: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2a90: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
2aa0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
2ab0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
2ac0: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
2ad0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2ae0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
2af0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
2b00: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
2b10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
2b20: 65 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74  else{.    height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
2b40: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
2b50: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
2b60: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
2b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2b80: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
2b90: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
2ba0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
2bb0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
2bc0: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
2bd0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2be0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
2bf0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
2c00: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
2c10: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
2c20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c30: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61  ExprSetHeight(Pa
2c40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2c50: 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74  r *p){.  exprSet
2c60: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
2c70: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2c80: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
2c90: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
2ca0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
2cb0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
2cc0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
2cd0: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
2ce0: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
2cf0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
2d00: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
2d10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2d20: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
2d30: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
2d40: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2d50: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
2d60: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
2d70: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
2d80: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
2d90: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
2da0: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
2db0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2dc0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
2dd0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2de0: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
2df0: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
2e00: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
2e10: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2e20: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
2e30: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
2e40: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
2e50: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
2e60: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
2e70: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
2e80: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
2e90: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
2ea0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
2eb0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
2ec0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
2ed0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2ee0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
2ef0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
2f00: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
2f10: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
2f20: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
2f30: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
2f40: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
2f50: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
2f60: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
2f70: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61  ting is performa
2f80: 6e 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74  nce.  The deQuot
2f90: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  e.** parameter i
2fa0: 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f  s ignored if pTo
2fb0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  ken is NULL or i
2fc0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73  f the token does
2fd0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74   not.** appear t
2fe0: 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66  o be quoted.  If
2ff0: 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65   the quotes were
3000: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e   of the form "..
3010: 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ." (double-quote
3020: 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45  s).** then the E
3030: 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67  P_DblQuoted flag
3040: 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65   is set on the e
3050: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a  xpression node..
3060: 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61  **.** Special ca
3070: 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49  se:  If op==TK_I
3080: 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65  NTEGER and pToke
3090: 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  n points to a st
30a0: 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ring that.** can
30b0: 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69   be translated i
30c0: 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nto a 32-bit int
30d0: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74  eger, then the t
30e0: 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  oken is not.** s
30f0: 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65  tored in u.zToke
3100: 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  n.  Instead, the
3110: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
3120: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
3130: 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20  to u.iValue and 
3140: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
3150: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f  flag is set.  No
3160: 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a   extra storage.*
3170: 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74  * is allocated t
3180: 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67  o hold the integ
3190: 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20  er text and the 
31a0: 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20  dequote flag is 
31b0: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72  ignored..*/.Expr
31c0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c   *sqlite3ExprAll
31d0: 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  oc(.  sqlite3 *d
31e0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
31f0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
3200: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3210: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
3220: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3240: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3250: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
3260: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
3270: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
3280: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
3290: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
32a0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
32b0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
32c0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
32d0: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
32e0: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
32f0: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  lue = 0;..  if( 
3300: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
3310: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
3320: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
3330: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
3340: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
3350: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
3360: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
3370: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
3380: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
3390: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
33a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
33b0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
33c0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
33d0: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
33e0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
33f0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3400: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3410: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3420: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3430: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3440: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3450: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3460: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3480: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3490: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
34a0: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
34b0: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
34c0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
34d0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
34e0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
34f0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3500: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3510: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3520: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3530: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3540: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3550: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3560: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3570: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3590: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
35a0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
35b0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
35c0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
35d0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
35e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35f0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3600: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3610: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3620: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3640: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3650: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3660: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3670: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3680: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3690: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
36a0: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
36b0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
36c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
36d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
36e0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
36f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3700: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3710: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3730: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3740: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3750: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3760: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3770: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3780: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3790: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
37a0: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
37b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
37c0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
37d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
37e0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
37f0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3800: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3810: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3820: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3830: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3840: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3850: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3860: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3870: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3880: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3890: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
38a0: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
38b0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
38c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
38d0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
38e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
38f0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
3900: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3910: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3920: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3940: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3950: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3960: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3970: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3980: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3990: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
39a0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
39b0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
39c0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
39d0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
39e0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
39f0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
3a00: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3a10: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3a20: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3a30: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3a40: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3a50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3a60: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3a70: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3a80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3a90: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3aa0: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
3ab0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
3ac0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
3ad0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
3ae0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
3af0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
3b00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3b10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3b20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3b30: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3b40: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3b50: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3b60: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3b70: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3b80: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3b90: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3ba0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3bb0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3bc0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3bd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3be0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
3bf0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
3c00: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3c10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3c20: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3c30: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3c40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3c50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3c60: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3c70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3c80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3c90: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3ca0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3cb0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3cc0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3cd0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3ce0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
3cf0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
3d00: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3d10: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3d20: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3d30: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
3d40: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
3d50: 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b   op, pToken, 1);
3d60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  .  sqlite3ExprAt
3d70: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3d80: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3d90: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72 65  t, pRight);.  re
3da0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3db0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3dc0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3dd0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3de0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3df0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3e00: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3e10: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3e20: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
3e30: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
3e40: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3e50: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
3e60: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
3e70: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
3e80: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
3e90: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
3ea0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3eb0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeft;.  }else{.
3ec0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
3ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3ee0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
3ef0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3f00: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3f10: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
3f20: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
3f30: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
3f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
3f50: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
3f60: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
3f70: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
3f80: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
3f90: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
3fa0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
3fb0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
3fc0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
3fd0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
3fe0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
3ff0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4000: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
4010: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
4020: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4030: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4040: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4050: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
4060: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
4070: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4080: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
4090: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
40a0: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
40b0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
40c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
40d0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
40e0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
40f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4100: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
4110: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
4120: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
4130: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
4140: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4150: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
4160: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
4170: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
4180: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
4190: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
41a0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
41b0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
41c0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
41d0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
41e0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
41f0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
4200: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
4210: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
4220: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
4230: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
4240: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
4250: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
4260: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
4270: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
4280: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
4290: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
42a0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
42b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
42c0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
42d0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
42e0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
42f0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4300: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4310: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4320: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4330: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4340: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4350: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4360: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
4370: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
4380: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
4390: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
43a0: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
43b0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
43c0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
43d0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
43e0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
43f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4400: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
4410: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4420: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
4430: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
4440: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4450: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
4460: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4470: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
4480: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
4490: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
44a0: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
44b0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
44c0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
44d0: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
44e0: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20  if( z[1]==0 ){. 
44f0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4500: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
4510: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
4520: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
4540: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20  z[0]=='?' );.   
4550: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4560: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
4570: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30  .  }else if( z[0
4580: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a  ]=='?' ){.    /*
4590: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
45a0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
45b0: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
45c0: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
45d0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
45e0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
45f0: 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ber */.    int i
4600: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
4610: 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28  ble = i = atoi((
4620: 63 68 61 72 2a 29 26 7a 5b 31 5d 29 3b 0a 20 20  char*)&z[1]);.  
4630: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
4640: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
4650: 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65  ( i==1 );.    te
4660: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
4670: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4680: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4690: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74 65 73  ER]-1 );.    tes
46a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
46b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
46c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
46d0: 52 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  R] );.    if( i<
46e0: 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69  1 || i>db->aLimi
46f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4700: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4710: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4720: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4730: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
4740: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
4750: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
4760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69           db->aLi
4770: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4780: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4790: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
47a0: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
47b0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
47c0: 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20  ->nVar = i;.    
47d0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
47e0: 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65  * Wildcards like
47f0: 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20   ":aaa", "$aaa" 
4800: 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73  or "@aaa".  Reus
4810: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
4820: 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  ble.    ** numbe
4830: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
4840: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
4850: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
4860: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a  f the name.    *
4870: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
4880: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
4890: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
48a0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
48b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
48c0: 20 20 75 33 32 20 6e 3b 0a 20 20 20 20 6e 20 3d    u32 n;.    n =
48d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
48e0: 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (z);.    for(i=0
48f0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72  ; i<pParse->nVar
4900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
4910: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 50 61    Expr *pE = pPa
4920: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
4930: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
4940: 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pE!=0 );.      
4950: 69 66 28 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 75  if( memcmp(pE->u
4960: 2e 7a 54 6f 6b 65 6e 2c 20 7a 2c 20 6e 29 3d 3d  .zToken, z, n)==
4970: 30 20 26 26 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65  0 && pE->u.zToke
4980: 6e 5b 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n[n]==0 ){.     
4990: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
49a0: 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pE->iTable;. 
49b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
49c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
49d0: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
49e0: 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20  VarExpr ){.     
49f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4a00: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
4a10: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
4a20: 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61  e->nVarExpr>=pPa
4a30: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4a40: 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  oc-1 ){.        
4a50: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4a60: 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d  Alloc += pParse-
4a70: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
4a80: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61   10;.        pPa
4a90: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d  rse->apVarExpr =
4aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4ab0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
4ac0: 72 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ree(.           
4ad0: 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20     db,.         
4ae0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4af0: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
4b00: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4b10: 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65  arExprAlloc*size
4b20: 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  of(pParse->apVar
4b30: 45 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20  Expr[0]).       
4b40: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
4b50: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
4b60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4b70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4b80: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4b90: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
4ba0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4bb0: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
4bc0: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
4bd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
4be0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4bf0: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
4c00: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
4c10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4c20: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
4c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4c40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
4c50: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
4c60: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
4c70: 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 20 65 78  *.** Clear an ex
4c80: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
4c90: 72 65 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  re without delet
4ca0: 69 6e 67 20 74 68 65 20 73 74 72 75 63 74 75 72  ing the structur
4cb0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 53 75 62  e itself..** Sub
4cc0: 73 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c  structure is del
4cd0: 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eted..*/.void sq
4ce0: 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28 73  lite3ExprClear(s
4cf0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4d00: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4d10: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  p!=0 );.  if( !E
4d20: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
4d30: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
4d40: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
4d50: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4d60: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
4d70: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4d80: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
4d90: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
4da0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
4db0: 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e  Reduced) && (p->
4dc0: 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c  flags2 & EP2_Mal
4dd0: 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29  locedToken)!=0 )
4de0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4df0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
4e00: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
4e10: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4e20: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
4e30: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
4e40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
4e50: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
4e60: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
4e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4e80: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4e90: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
4ea0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
4eb0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
4ec0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
4ed0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
4ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4ef0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
4f00: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
4f10: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
4f20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61   sqlite3ExprClea
4f30: 72 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20  r(db, p);.  if( 
4f40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4f50: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
4f60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
4f70: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4f90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
4fa0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
4fb0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
4fc0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
4fd0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
4fe0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
4ff0: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5000: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5010: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5020: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5030: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
5040: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
5050: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5060: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
5070: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5080: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
5090: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
50a0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
50b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
50c0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
50d0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
50e0: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
50f0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5100: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5110: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5120: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5130: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5140: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
5150: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
5160: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
5170: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
5180: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
5190: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
51a0: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
51b0: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
51c0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
51d0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
51e0: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
51f0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5200: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5210: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5220: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5230: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
5240: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
5250: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
5260: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
5270: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
5280: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
5290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52d0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
52e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
52f0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
5300: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
5310: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
5320: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
5330: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
5340: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
5350: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
5360: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
5370: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
5380: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
5390: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
53a0: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
53b0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
53c0: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
53d0: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
53e0: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
53f0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
5400: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
5410: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
5420: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5430: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
5440: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
5450: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
5460: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
5470: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
5480: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
5490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
54a0: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
54b0: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
54c0: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
54d0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
54e0: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
54f0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
5500: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
5510: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
5520: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
5530: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
5540: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
5550: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
5560: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
5570: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
5580: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
5590: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
55a0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
55b0: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
55c0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
55d0: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
55e0: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
55f0: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
5600: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
5610: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5620: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
5630: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
5640: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5650: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
5660: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
5670: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
5680: 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52  make a EXPRDUP_R
5690: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
56a0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
56b0: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
56c0: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
56d0: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
56e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
56f0: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
5700: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
5710: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
5720: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
5730: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
5740: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
5750: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
5760: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
5770: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
5780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
5790: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
57a0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
57b0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
57c0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
57d0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
57e0: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
57f0: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
5800: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
5810: 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66  d */.  if( 0==(f
5820: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5830: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
5840: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
5850: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
5860: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5870: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
5880: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
5890: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
58a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
58b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
58c0: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
58d0: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
58e0: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
58f0: 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20  dToken)==0 );.  
5900: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c    assert( (p->fl
5910: 61 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64  ags2 & EP2_Irred
5920: 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  ucible)==0 );.  
5930: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
5940: 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70  | p->pRight || p
5950: 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e  ->pColl || p->x.
5960: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
5970: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
5980: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
5990: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
59a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
59b0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
59c0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
59d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
59e0: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
59f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5a00: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
5a10: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
5a20: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
5a30: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
5a40: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5a50: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
5a60: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
5a70: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
5a80: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
5a90: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
5aa0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5ab0: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
5ac0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5ad0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
5ae0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5af0: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
5b00: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
5b10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5b20: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
5b30: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
5b40: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
5b50: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
5b60: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
5b70: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
5b80: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
5b90: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5ba0: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5bb0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
5bc0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
5bd0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5be0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5bf0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
5c00: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5c10: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
5c20: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
5c30: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
5c40: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5c50: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
5c60: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
5c70: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5c80: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
5c90: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
5ca0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
5cb0: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
5cc0: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
5cd0: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
5ce0: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
5cf0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
5d00: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
5d10: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
5d20: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
5d30: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
5d40: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
5d50: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
5d60: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
5d70: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
5d80: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
5d90: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
5da0: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
5db0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5dc0: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
5dd0: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
5de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
5df0: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
5e00: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
5e10: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
5e20: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
5e30: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
5e40: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
5e50: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
5e60: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5e70: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
5e80: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
5e90: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
5ea0: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
5eb0: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
5ec0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
5ed0: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
5ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
5ef0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
5f00: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
5f10: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
5f20: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
5f30: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
5f40: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
5f50: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
5f60: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
5f70: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
5f80: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
5f90: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
5fa0: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
5fb0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
5fc0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
5fd0: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
5fe0: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
5ff0: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6000: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6010: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6020: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6030: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
6040: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
6050: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
6060: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
6070: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
6080: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
6090: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
60a0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
60b0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
60c0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
60d0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
60e0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6100: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6110: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6120: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6130: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6140: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6150: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6160: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6170: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6180: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
6190: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
61a0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
61b0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
61c0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
61d0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
61e0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
61f0: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6200: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6210: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6220: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6230: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
6240: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6250: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
6260: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
6270: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
6280: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
6290: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
62a0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
62b0: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
62c0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
62d0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
62e0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
62f0: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6300: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6310: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6320: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6330: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
6340: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
6350: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
6360: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6370: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
6380: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
6390: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
63a0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
63b0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
63c0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
63d0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
63e0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
63f0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6400: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6410: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6420: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6430: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
6440: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
6450: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6460: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
6470: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
6480: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6490: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
64a0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
64b0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
64c0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
64d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
64e0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
64f0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6500: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6510: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6520: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6530: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6540: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
6550: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6560: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
6570: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
6580: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
6590: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
65a0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
65b0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
65c0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
65d0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
65e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
65f0: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6600: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6610: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6620: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6630: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
6640: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
6650: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6660: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29  nOnly|EP_Static)
6670: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
6680: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
6690: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
66a0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
66b0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
66c0: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
66d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
66e0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
66f0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
6700: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
6710: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
6720: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
6730: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
6740: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
6750: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
6760: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
6770: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
6780: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
6790: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
67a0: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
67b0: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
67c0: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
67d0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
67e0: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
67f0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
6800: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
6810: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6820: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6830: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
6840: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
6850: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6860: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
6870: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
6880: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
6890: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
68a0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
68b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
68c0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
68d0: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
68e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
68f0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6900: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
6910: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
6920: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
6930: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6940: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
6950: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6960: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
6970: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
6980: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6990: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
69a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
69b0: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
69c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
69d0: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
69e0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
69f0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6a00: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6a10: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6a20: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
6a30: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
6a40: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
6a50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6a60: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
6a70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
6a80: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
6a90: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6aa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ab0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d    pNew->flags2 =
6ac0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6ad0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
6ae0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
6af0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6b00: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6b10: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6b20: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
6b30: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6b40: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
6b50: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
6b60: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
6b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6b80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6b90: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6ba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
6bb0: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
6bc0: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
6bd0: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
6be0: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
6bf0: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
6c00: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
6c10: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
6c20: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
6c30: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
6c40: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
6c50: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
6c60: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
6c70: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
6c80: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
6c90: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
6ca0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
6cb0: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
6cc0: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
6cd0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6ce0: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
6cf0: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
6d00: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
6d10: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
6d20: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
6d30: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
6d40: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
6d50: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
6d60: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
6d70: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
6d80: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
6d90: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
6da0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
6db0: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
6dc0: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
6dd0: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
6de0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
6df0: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
6e00: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
6e10: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
6e20: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
6e30: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
6e40: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
6e50: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
6e60: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
6e70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
6e80: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
6e90: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
6ea0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6eb0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6ec0: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
6ed0: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
6ee0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
6ef0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
6f00: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44  {.  return exprD
6f10: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
6f20: 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20   0);.}.ExprList 
6f30: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
6f40: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
6f50: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
6f60: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
6f70: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
6f80: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
6f90: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
6fa0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
6fb0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
6fc0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
6fd0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6fe0: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
6ff0: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
7000: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7010: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
7020: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
7030: 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  Expr = pNew->nAl
7040: 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  loc = p->nExpr;.
7050: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65    pNew->a = pIte
7060: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
7070: 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e  locRaw(db,  p->n
7080: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
7090: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
70a0: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
70b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
70c0: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
70d0: 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64  n 0;.  } .  pOld
70e0: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
70f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
7100: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
7110: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
7120: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
7130: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
7140: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
7150: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
7160: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45  xprDup(db, pOldE
7170: 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  xpr, flags);.   
7180: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
7190: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
71a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
71b0: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
71c0: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
71d0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
71e0: 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  dItem->zSpan);. 
71f0: 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72     pItem->sortOr
7200: 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  der = pOldItem->
7210: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
7220: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
7230: 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20      pItem->iCol 
7240: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c  = pOldItem->iCol
7250: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c  ;.    pItem->iAl
7260: 69 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ias = pOldItem->
7270: 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65  iAlias;.  }.  re
7280: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7290: 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20  .** If cursors, 
72a0: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20  triggers, views 
72b0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61  and subqueries a
72c0: 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66  re all omitted f
72d0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  rom.** the build
72e0: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
72f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
7300: 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f  tines, except fo
7310: 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  r .** sqlite3Sel
7320: 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65  ectDup(), can be
7330: 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33   called. sqlite3
7340: 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73  SelectDup() is s
7350: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c  ometimes.** call
7360: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61  ed with a NULL a
7370: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
7380: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7390: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
73a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
73b0: 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c  IT_TRIGGER) \. |
73c0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
73d0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
73e0: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
73f0: 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69  3SrcListDup(sqli
7400: 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
7410: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7420: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
7430: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
7440: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
7450: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7460: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
7470: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
7480: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
7490: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
74a0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
74b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
74c0: 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  aw(db, nByte );.
74d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
74e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
74f0: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
7500: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
7510: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7520: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
7530: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7540: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
7550: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
7560: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7570: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
7580: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
7590: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
75a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
75b0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62  base = sqlite3Db
75c0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
75d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
75e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
75f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7600: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7610: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
7620: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
7630: 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  s = sqlite3DbStr
7640: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7650: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
7660: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
7670: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
7680: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
7690: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
76a0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
76b0: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
76c0: 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70  >isPopulated = p
76d0: 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  OldItem->isPopul
76e0: 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74  ated;.    pNewIt
76f0: 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
7700: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7710: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65   pOldItem->zInde
7720: 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  x);.    pNewItem
7730: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70  ->notIndexed = p
7740: 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65  OldItem->notInde
7750: 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  xed;.    pNewIte
7760: 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64  m->pIndex = pOld
7770: 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Item->pIndex;.  
7780: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
7790: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
77a0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
77b0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
77c0: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
77d0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
77e0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
77f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7800: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
7810: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
7820: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
7830: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7840: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
7850: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
7860: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
7870: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7880: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7890: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
78a0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
78b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
78c0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
78d0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
78e0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
78f0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
7900: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
7910: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
7920: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
7930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7940: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7950: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
7960: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
7970: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
7980: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
7990: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
79a0: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
79b0: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
79c0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d  MallocRaw(db, p-
79d0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
79e0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
79f0: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
7a00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7a10: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
7a20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
7a30: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
7a40: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
7a50: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
7a60: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
7a70: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
7a80: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
7a90: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
7aa0: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
7ab0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
7ac0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7ad0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
7ae0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78     pNewItem->idx
7af0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78   = pOldItem->idx
7b00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7b10: 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73  New;.}.Select *s
7b20: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7b30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
7b40: 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ect *p, int flag
7b50: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  s){.  Select *pN
7b60: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
7b70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7b80: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7b90: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
7ba0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
7bb0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7bc0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
7bd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
7be0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
7bf0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
7c00: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
7c10: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
7c20: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
7c30: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
7c40: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
7c50: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
7c60: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
7c70: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
7c80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7c90: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
7ca0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7cb0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
7cc0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7cd0: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
7ce0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
7cf0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
7d00: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
7d10: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
7d20: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
7d30: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
7d40: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
7d50: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  lectDup(db, p->p
7d60: 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20  Prior, flags);. 
7d70: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
7d80: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7d90: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c  b, p->pLimit, fl
7da0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
7db0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
7dc0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
7dd0: 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20  ffset, flags);. 
7de0: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
7df0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
7e00: 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  et = 0;.  pNew->
7e10: 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
7e20: 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65  lFlags & ~SF_Use
7e30: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e  sEphemeral;.  pN
7e40: 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
7e50: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72   0;.  pNew->addr
7e60: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
7e70: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
7e80: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
7e90: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7ea0: 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
7eb0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23  return pNew;.}.#
7ec0: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
7ed0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
7ee0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
7ef0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7f00: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
7f10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
7f20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
7f30: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
7f40: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
7f50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7f60: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
7f70: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
7f80: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
7f90: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
7fa0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
7fb0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7fc0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
7fd0: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
7fe0: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
7ff0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
8000: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
8010: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
8020: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
8030: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
8040: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
8050: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
8060: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
8070: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
8080: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
8090: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
80a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
80b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
80c0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
80d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
80e0: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
80f0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
8100: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
8110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
8120: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
8130: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
8140: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
8150: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8160: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
8170: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
8180: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
8190: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
81a0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
81b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
81c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
81d0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
81e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
81f0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
8200: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
8210: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
8220: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
8230: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8240: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
8250: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
8260: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
8270: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
8280: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a  db, pList->a, n*
8290: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
82a0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
82b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
82c0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
82d0: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
82e0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
82f0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
8300: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f  llocSize(db, a)/
8310: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20  sizeof(a[0]);.  
8320: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
8330: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
8340: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
8350: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8360: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
8370: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
8380: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
8390: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
83a0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
83b0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
83c0: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
83d0: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
83e0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
83f0: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
8400: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
8410: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
8420: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8430: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
8440: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8450: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
8460: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8470: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
8480: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
8490: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
84a0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
84b0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
84c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
84d0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
84e0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
84f0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8500: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
8510: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8520: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8530: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8540: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8550: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8560: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8580: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
8590: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
85a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
85b0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
85c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
85d0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
85e0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
85f0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8600: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
8610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8620: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
8630: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8650: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
8660: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
8670: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
8680: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
8690: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
86a0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
86b0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
86c0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
86d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
86e0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
86f0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8700: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
8710: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
8720: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
8730: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
8740: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
8750: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
8760: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
8770: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
8780: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
8790: 64 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d  dequote && pItem
87a0: 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65  ->zName ) sqlite
87b0: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
87c0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
87d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
87e0: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
87f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
8800: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
8810: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
8820: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
8830: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
8840: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
8850: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
8860: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
8870: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
8880: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
8890: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
88a0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
88b0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
88c0: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
88d0: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
88e0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
88f0: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
8900: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
8910: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8920: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
8930: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
8940: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
8950: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
8960: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
8970: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
8980: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
8990: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
89a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
89b0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
89c0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
89d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
89e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
89f0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8a00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8a10: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
8a20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
8a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
8a40: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
8a50: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
8a60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
8a70: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
8a80: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
8a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8aa0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
8ab0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
8ac0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
8ad0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
8ae0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
8b20: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
8b30: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
8b40: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
8b50: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
8b60: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
8b70: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
8b80: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
8b90: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8ba0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
8bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8bc0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
8bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8be0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
8bf0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
8c00: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
8c10: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
8c20: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
8c30: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
8c40: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
8c50: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
8c60: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
8c70: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
8c80: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
8c90: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
8ca0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
8cb0: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
8cc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8cd0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
8ce0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
8cf0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
8d00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
8d10: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
8d20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
8d30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8d40: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
8d50: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
8d60: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
8d70: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
8d80: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8d90: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
8da0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
8db0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8dc0: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
8dd0: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
8de0: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
8df0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
8e00: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
8e10: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  loc );.  for(pIt
8e20: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
8e30: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
8e40: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
8e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
8e70: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
8e80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8e90: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
8ea0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8eb0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
8ec0: 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
8ed0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
8ee0: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
8ef0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
8f00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  );.}../*.** Thes
8f10: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
8f20: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  alker callbacks.
8f30: 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73    Walker.u.pi is
8f40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8f50: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68   an integer.  Th
8f60: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
8f70: 20 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70   checking an exp
8f80: 72 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a  ression to see.*
8f90: 2a 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e  * if it is a con
8fa0: 73 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c  stant.  Set *Wal
8fb0: 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66  ker.u.pi to 0 if
8fc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8fd0: 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61  is.** not consta
8fe0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  nt..**.** These 
8ff0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
9000: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
9010: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
9020: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
9030: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9040: 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20  nstant().**     
9050: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9060: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a  stantNotJoin().*
9070: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
9080: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
9090: 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74  ction().**.*/.st
90a0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
90b0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
90c0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
90d0: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
90e0: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69   If pWalker->u.i
90f0: 20 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74   is 3 then any t
9100: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
9110: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
9120: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
9130: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
9140: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73  es of a join dis
9150: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
9160: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
9170: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
9180: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
9190: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
91a0: 75 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61  u.i==3 && ExprHa
91b0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
91c0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
91d0: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
91e0: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65  >u.i = 0;.    re
91f0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9200: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
9210: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
9220: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
9230: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
9240: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
9250: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
9260: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
9270: 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  and pWalker->u.i
9280: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
9290: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
92a0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
92b0: 75 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20  u.i==2 ) return 
92c0: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
92d0: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
92e0: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
92f0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
9300: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
9310: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
9320: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
9330: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
9340: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9350: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
9360: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9370: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
9380: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9390: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
93a0: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
93b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
93c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
93d0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57  LUMN );.      pW
93e0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
93f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
9400: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61  _Abort;.    defa
9410: 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63  ult:.      testc
9420: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9430: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20  TK_SELECT ); /* 
9440: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
9450: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
9460: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ow */.      test
9470: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9480: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a  =TK_EXISTS ); /*
9490: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
94a0: 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c  stant will disal
94b0: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
94c0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
94d0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
94e0: 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  nt selectNodeIsC
94f0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
9500: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
9510: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
9520: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
9530: 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65  tUsed);.  pWalke
9540: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65  r->u.i = 0;.  re
9550: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9560: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
9570: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
9580: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b  , int initFlag){
9590: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
95a0: 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b  .u.i = initFlag;
95b0: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
95c0: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
95d0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
95e0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
95f0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
9600: 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ant;.  sqlite3Wa
9610: 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
9620: 20 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d   return w.u.i;.}
9630: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
9640: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9650: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
9660: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9670: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
9680: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
9690: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
96a0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
96b0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
96c0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
96d0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
96e0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
96f0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
9700: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
9710: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
9720: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9730: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
9740: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
9750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9760: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
9770: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
9780: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29  xprIsConst(p, 1)
9790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
97a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
97b0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
97c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
97d0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74  is constant.** t
97e0: 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67  hat does no orig
97f0: 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f  inate from the O
9800: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
9810: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  es of a join..**
9820: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9830: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
9840: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
9850: 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72  alls or terms fr
9860: 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55  om.** an ON or U
9870: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  SING clause..*/.
9880: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9890: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
98a0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
98b0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
98c0: 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 3);.}../*.** 
98d0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
98e0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
98f0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
9900: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
9910: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
9920: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
9930: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
9940: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
9950: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
9960: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
9970: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
9980: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9990: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
99a0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
99b0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
99c0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
99d0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
99e0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
99f0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9a00: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9a10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9a20: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
9a30: 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  tion(Expr *p){. 
9a40: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9a50: 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 2);.}../*
9a60: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9a70: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
9a80: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
9a90: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
9aa0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
9ab0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
9ac0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
9ad0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
9ae0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
9af0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
9b00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9b10: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
9b20: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
9b30: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
9b40: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
9b50: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
9b60: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
9b70: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
9b80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9b90: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
9ba0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
9bb0: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
9bc0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61   0;.  if( p->fla
9bd0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
9be0: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
9bf0: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
9c00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9c10: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
9c20: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9c30: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
9c40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74   rc = sqlite3Get
9c50: 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
9c60: 6e 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  n, pValue);.    
9c70: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20    assert( rc==0 
9c80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9c90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
9ca0: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
9cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
9cc0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
9cd0: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
9ce0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9cf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
9d00: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
9d10: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
9d20: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9d30: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
9d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   ){.        *pVa
9d50: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
9d60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
9d70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9d80: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
9d90: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  : break;.  }.  i
9da0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 61 73 73  f( rc ){.    ass
9db0: 65 72 74 28 20 45 78 70 72 48 61 73 41 6e 79 50  ert( ExprHasAnyP
9dc0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
9dd0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
9de0: 6c 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly).            
9df0: 20 20 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 32     || (p->flags2
9e00: 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54   & EP2_MallocedT
9e10: 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  oken)==0 );.    
9e20: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  p->op = TK_INTEG
9e30: 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  ER;.    p->flags
9e40: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
9e50: 0a 20 20 20 20 70 2d 3e 75 2e 69 56 61 6c 75 65  .    p->u.iValue
9e60: 20 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a   = *pValue;.  }.
9e70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9e80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
9e90: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
9ea0: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
9eb0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
9ec0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
9ed0: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
9ee0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
9ef0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
9f00: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
9f10: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9f20: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
9f30: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
9f40: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9f50: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
9f60: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
9f70: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
9f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9f90: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9fa0: 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f  able to the IN o
9fb0: 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61  perator optimiza
9fc0: 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65  tion on a.** que
9fd0: 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
9fe0: 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20  *.**       x IN 
9ff0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
a000: 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  ** Where the SEL
a010: 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73  ECT... clause is
a020: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79   as specified by
a030: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74   the parameter t
a040: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
a050: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c  e..**.** The Sel
a060: 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ect object passe
a070: 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79  d in has already
a080: 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73   been preprocess
a090: 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72  ed and no.** err
a0a0: 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f  ors have been fo
a0b0: 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  und..*/.#ifndef 
a0c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a0d0: 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20  UERY.static int 
a0e0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
a0f0: 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Opt(Select *p){.
a100: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
a110: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
a120: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
a130: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
a140: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a160: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
a170: 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20  of IN is SELECT 
a180: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
a190: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a1b0: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
a1c0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
a1d0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
a1e0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
a1f0: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
a200: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
a210: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
a220: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
a230: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
a240: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a250: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
a260: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
a270: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
a280: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
a290: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
a2a0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
a2b0: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
a2c0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
a2d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
a2e0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a300: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
a310: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
a320: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
a330: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
a340: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
a350: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
a360: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
a370: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
a380: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
a390: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
a3a0: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
a3b0: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3d0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
a3e0: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
a3f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
a400: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
a410: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
a420: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
a430: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
a440: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
a450: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
a460: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
a470: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
a480: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
a490: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
a4a0: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
a4b0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
a4c0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61  .  if( NEVER(pTa
a4d0: 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  b==0) ) return 0
a4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
a4f0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
a500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
a510: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
a520: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
a530: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
a540: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
a550: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
a560: 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
a570: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
a580: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
a590: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
a5a0: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
a5b0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
a5c0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
a5d0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66  sult set */.  if
a5e0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
a5f0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
a600: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  UMN ) return 0; 
a610: 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63  /* Result is a c
a620: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72  olumn */.  retur
a630: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a650: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
a660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a670: 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
a680: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
a690: 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
a6a0: 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f  ator..** It's jo
a6b0: 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  b is to find or 
a6c0: 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
a6d0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d  structure that m
a6e0: 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69  ay be used.** ei
a6f0: 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
a700: 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74   membership of t
a710: 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20  he (...) set or 
a720: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
a730: 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72  gh.** its member
a740: 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  s, skipping dupl
a750: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  icates..**.** Th
a760: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
a770: 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20  ursor opened on 
a780: 74 68 65 20 62 2d 74 72 65 65 20 28 64 61 74 61  the b-tree (data
a790: 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61  base table, data
a7a0: 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f  base index .** o
a7b0: 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65  r ephermal table
a7c0: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  ) is stored in p
a7d0: 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65  X->iTable before
a7e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
a7f0: 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72  eturns..** The r
a800: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
a810: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a820: 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
a830: 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
a840: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
a850: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54  _INDEX_ROWID - T
a860: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
a870: 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61  ened on a databa
a880: 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  se table..**   I
a890: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20  N_INDEX_INDEX - 
a8a0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
a8b0: 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
a8c0: 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ase index..**   
a8d0: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20  IN_INDEX_EPH -  
a8e0: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
a8f0: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
a900: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
a910: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
a920: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
a930: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
a940: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  e..**.** An exis
a950: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20  ting b-tree may 
a960: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
a970: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
a980: 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66   the simple.** f
a990: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  orm:.**.**     S
a9a0: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
a9b0: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
a9c0: 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f  * If the prNotFo
a9d0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  und parameter is
a9e0: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74   0, then the b-t
a9f0: 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
aa00: 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
aa10: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
aa20: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
aa30: 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e   any duplicates.
aa40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
aa50: 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61  .** epheremal ta
aa60: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
aa70: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
aa80: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
aa90: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
aaa0: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
aab0: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
aac0: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
aad0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
aae0: 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  ** has a UNIQUE 
aaf0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e  constraint or UN
ab00: 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  IQUE index..**.*
ab10: 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f  * If the prNotFo
ab20: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  und parameter is
ab30: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65   not 0, then the
ab40: 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
ab50: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
ab60: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
ab70: 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20   tests. In this 
ab80: 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61  case an epherema
ab90: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
aba0: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
abb0: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
abc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
abd0: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
abe0: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
abf0: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
ac00: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
ac10: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  olumn..**.** Whe
ac20: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
ac30: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
ac40: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
ac50: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
ac60: 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74  ction.** needs t
ac70: 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
ac80: 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74  r not the struct
ac90: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ure contains an 
aca0: 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c  SQL NULL .** val
acb0: 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ue in order to c
acc0: 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74  orrectly evaluat
acd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69  e expressions li
ace0: 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22  ke "X IN (Y, Z)"
acf0: 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  ..** If there is
ad00: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
ad10: 68 65 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  he b-tree might 
ad20: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
ad30: 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
ad40: 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
ad50: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
ad60: 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
ad70: 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
ad80: 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75  .** to *prNotFou
ad90: 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nd. If there is 
ada0: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
adb0: 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
adc0: 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
add0: 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46  ue, then *prNotF
ade0: 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63  ound is left unc
adf0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
ae00: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
ae10: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
ae20: 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
ae30: 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c   in *prNotFound,
ae40: 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69   then.** its ini
ae50: 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55  tial value is NU
ae60: 4c 4c 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  LL. If the b-tre
ae70: 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69  e does not remai
ae80: 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f  n constant.** fo
ae90: 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f  r the duration o
aea0: 66 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65  f the query (i.e
aeb0: 2e 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  . the SELECT tha
aec0: 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
aed0: 62 2d 74 72 65 65 0a 2a 2a 20 69 73 20 61 20 63  b-tree.** is a c
aee0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
aef0: 72 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ry) then the val
af00: 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ue of the alloca
af10: 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a  ted register is.
af20: 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  ** reset to NULL
af30: 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 62   each time the b
af40: 2d 74 72 65 65 20 69 73 20 72 65 70 6f 70 75 6c  -tree is repopul
af50: 61 74 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ated. This allow
af60: 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  s the.** caller 
af70: 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65  to use vdbe code
af80: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
af90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
afa0: 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74  .**   if( regist
afb0: 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20  er==NULL ){.**  
afc0: 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74     has_null = <t
afd0: 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75  est if data stru
afe0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e  cture contains n
aff0: 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69  ull>.**     regi
b000: 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a  ster = 1.**   }.
b010: 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  **.** in order t
b020: 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20  o avoid running 
b030: 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74  the <test if dat
b040: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
b050: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65  ains null>.** te
b060: 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  st more often th
b070: 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  an is necessary.
b080: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b090: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b0a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
b0b0: 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  InIndex(Parse *p
b0c0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c  Parse, Expr *pX,
b0d0: 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64   int *prNotFound
b0e0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
b110: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
b120: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
b130: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
b140: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b160: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
b170: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
b180: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
b190: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
b1a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
b1b0: 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
b1c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
b1d0: 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f  BeUnique = (prNo
b1e0: 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a  tFound==0);   /*
b1f0: 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
b200: 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 0a  t be unique */..
b210: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
b220: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
b230: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
b240: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
b250: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
b260: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
b270: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
b280: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
b290: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
b2a0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
b2b0: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
b2c0: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
b2d0: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
b2e0: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
b2f0: 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e  ALWAYS(pParse->n
b300: 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e  Err==0) && isCan
b310: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
b320: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b330: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b340: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
b350: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
b360: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  ection */.    Ex
b370: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70  pr *pExpr = p->p
b380: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
b390: 72 3b 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  r;   /* Expressi
b3a0: 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  on <column> */. 
b3b0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
b3c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20  xpr->iColumn;   
b3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
b3e0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f  ex of column <co
b3f0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62  lumn> */.    Vdb
b400: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
b410: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
b420: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
b430: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
b440: 65 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  ed */.    Table 
b450: 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d  *pTab = p->pSrc-
b460: 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20 20 20 20  >a[0].pTab;     
b470: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
b480: 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  >. */.    int iD
b490: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
b4c0: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
b4d0: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
b4e0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
b4f0: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
b500: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
b510: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
b520: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
b530: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
b540: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
b550: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
b560: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
b570: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
b580: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
b590: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
b5a0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
b5b0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
b5c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
b5d0: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
b5e0: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
b5f0: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
b600: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b610: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
b620: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
b630: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
b640: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
b650: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
b660: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
b670: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
b680: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  {.      int iMem
b690: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
b6a0: 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  m;.      int iAd
b6b0: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
b6c0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
b6d0: 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 69  , iDb);..      i
b6e0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
b6f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
b700: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b720: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
b730: 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20   1, iMem);..    
b740: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
b750: 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
b760: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
b770: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
b780: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
b790: 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
b7a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b7b0: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
b7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
b7d0: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
b800: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
b810: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
b820: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
b830: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
b840: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
b850: 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
b860: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
b870: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
b880: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
b890: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
b8a0: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
b8b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b8c0: 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f  ce.  */.      Co
b8d0: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
b8e0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
b8f0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
b900: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
b910: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
b920: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
b930: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
b940: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
b950: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
b960: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
b970: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
b980: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
b990: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
b9a0: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
b9b0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
b9c0: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
b9d0: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
b9e0: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
b9f0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
ba00: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
ba10: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
ba20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ba30: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
ba40: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
ba50: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
ba60: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
ba70: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
ba80: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
ba90: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
baa0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
bab0: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
bac0: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
bad0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
bae0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
baf0: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
bb00: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70  azColl[0], 0)==p
bb10: 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  Req.         && 
bb20: 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c  (!mustBeUnique |
bb30: 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
bb40: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
bb50: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a  rror!=OE_None)).
bb60: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
bb70: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
bb80: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
bb90: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
bba0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ddr;.          c
bbb0: 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20  har *pKey;.  .  
bbc0: 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28          pKey = (
bbd0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e  char *)sqlite3In
bbe0: 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
bbf0: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
bc00: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
bc10: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
bc20: 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  b, pIdx->pSchema
bc30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
bc40: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
bc50: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
bc60: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
bc70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bc80: 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b  v, OP_If, iMem);
bc90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bca0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bcb0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
bcc0: 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  Mem);.  .       
bcd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bce0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
bcf0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
bd00: 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c             pKey,
bd30: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
bd40: 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  FF);.          V
bd50: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
bd60: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
bd70: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54  ));.          eT
bd80: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
bd90: 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20  NDEX;..         
bda0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
bdb0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
bdc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
bdd0: 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61  NotFound && !pTa
bde0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
bdf0: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
be00: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
be10: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
be20: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
be30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
be40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
be50: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
be60: 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
be70: 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  ound an existing
be80: 20 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74   able or index t
be90: 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
bea0: 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
beb0: 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
bec0: 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
bed0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
bee0: 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
bef0: 2f 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  /.    int rMayHa
bf00: 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
bf10: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
bf20: 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72  _EPH;.    if( pr
bf30: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  NotFound ){.    
bf40: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
bf50: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
bf60: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
bf70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d     }else if( pX-
bf80: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
bf90: 30 20 26 26 20 21 45 78 70 72 48 61 73 41 6e 79  0 && !ExprHasAny
bfa0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
bfb0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
bfc0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
bfd0: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
bfe0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
bff0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
c000: 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
c010: 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
c020: 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 7d  NDEX_ROWID);.  }
c030: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
c040: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
c050: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
c060: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c070: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
c080: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
c090: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20  ries used as an 
c0a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e  expression.** an
c0b0: 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  d IN operators. 
c0c0: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
c0d0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
c0e0: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
c0f0: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
c100: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
c110: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
c120: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
c130: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
c140: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
c150: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
c160: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
c170: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
c180: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
c190: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
c1a0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
c1b0: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
c1c0: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
c1d0: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
c1e0: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
c1f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
c200: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
c210: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
c220: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
c230: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
c240: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
c250: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
c260: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
c270: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
c280: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
c290: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
c2a0: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
c2b0: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
c2c0: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
c2d0: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
c2e0: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
c2f0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
c300: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
c310: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
c320: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
c330: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
c340: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
c350: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
c360: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
c370: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
c380: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
c390: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
c3a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
c3b0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
c3c0: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
c3d0: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
c3e0: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
c3f0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
c400: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
c410: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
c420: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
c430: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
c440: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
c450: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
c460: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
c470: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
c480: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
c490: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
c4a0: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
c4b0: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
c4c0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
c4d0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
c4e0: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
c4f0: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
c500: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
c510: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
c520: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
c530: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
c540: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
c550: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
c560: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
c570: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
c580: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
c590: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
c5a0: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
c5b0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
c5c0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
c5d0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
c5e0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
c5f0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
c600: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
c610: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
c620: 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e  resense or absen
c630: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
c640: 68 65 20 52 48 53 2e 0a 2a 2f 0a 23 69 66 6e 64  he RHS..*/.#ifnd
c650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c660: 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c  UBQUERY.void sql
c670: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
c680: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c690: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
c6a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c6b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
c6c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
c6d0: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
c6e0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
c6f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79  or */.  int rMay
c700: 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20  HaveNull,       
c710: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
c720: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
c730: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
c740: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
c750: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
c760: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
c770: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
c780: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
c790: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
c7a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
c7c0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
c7d0: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
c7e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c7f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
c800: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
c810: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
c820: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
c830: 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  arse);..  /* Thi
c840: 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72  s code must be r
c850: 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65  un in its entire
c860: 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ty every time it
c870: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
c880: 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74    ** if any of t
c890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
c8a0: 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
c8b0: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
c8c0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
c8d0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
c8e0: 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
c8f0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
c900: 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
c910: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
c920: 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
c930: 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
c940: 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
c950: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
c960: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
c970: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
c980: 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
c990: 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
c9a0: 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
c9b0: 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
c9c0: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
c9d0: 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
c9e0: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
c9f0: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
ca00: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ca10: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
ca20: 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
ca30: 72 54 61 62 20 29 7b 0a 20 20 20 20 69 6e 74 20  rTab ){.    int 
ca40: 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mem = ++pParse->
ca50: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
ca60: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ca70: 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20  P_If, mem);.    
ca80: 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74  testAddr = sqlit
ca90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
caa0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d  OP_Integer, 1, m
cab0: 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  em);.    assert(
cac0: 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 70   testAddr>0 || p
cad0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
cae0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a  cFailed );.  }..
caf0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
cb00: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
cb10: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63  TK_IN: {.      c
cb20: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
cb30: 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49      KeyInfo keyI
cb40: 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  nfo;.      int a
cb50: 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ddr;        /* A
cb60: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
cb70: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
cb80: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
cb90: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
cba0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 0a 20 20 20  xpr->pLeft;..   
cbb0: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
cbc0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
cbd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cbe0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
cbf0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20  rMayHaveNull);. 
cc00: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66       }..      af
cc10: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
cc20: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
cc30: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
cc40: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
cc50: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
cc60: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
cc70: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
cc80: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
cc90: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
cca0: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76  he same way. A v
ccb0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
ccc0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
ccd0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
cce0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
ccf0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
cd00: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
cd10: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
cd20: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
cd30: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
cd40: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
cd50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
cd60: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
cd70: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
cd80: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
cd90: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
cda0: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
cdb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
cdc0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
cdd0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
cde0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
cdf0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
ce00: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
ce10: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
ce20: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
ce30: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
ce40: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
ce50: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
ce60: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
ce70: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
ce80: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
ce90: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
cea0: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
ceb0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
cec0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
ced0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
cee0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
cef0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
cf00: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
cf10: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
cf20: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
cf30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cf40: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
cf50: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
cf60: 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
cf70: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
cf80: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
cf90: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
cfa0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
cfb0: 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69  ld = 1;..      i
cfc0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
cfd0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
cfe0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
cff0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
d000: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
d010: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
d020: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
d030: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
d040: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
d050: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
d060: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
d070: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
d080: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
d090: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
d0a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d0b0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
d0c0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
d0d0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
d0e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
d0f0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
d100: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d110: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
d120: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
d130: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
d140: 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28  est.affinity = (
d150: 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  u8)affinity;.   
d160: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
d170: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
d180: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
d190: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
d1a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
d1b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
d1c0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64  r->x.pSelect, &d
d1d0: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
d1e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
d1f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69    }.        pELi
d200: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  st = pExpr->x.pS
d210: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
d220: 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
d230: 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  S(pEList!=0 && p
d240: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20  EList->nExpr>0) 
d250: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65  ){ .          ke
d260: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
d270: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
d280: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
d290: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
d2a0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
d2b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
d2c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
d2d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d2e0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
d2f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
d300: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
d310: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
d320: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
d330: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
d340: 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
d350: 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
d360: 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
d370: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
d380: 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
d390: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
d3a0: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
d3b0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
d3c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
d3d0: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
d3e0: 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
d3f0: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
d400: 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
d410: 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
d420: 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
d430: 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
d440: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
d450: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
d460: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
d470: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
d480: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d490: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d4a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
d4b0: 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20   r2, r3;..      
d4c0: 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
d4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
d4e0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
d4f0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
d500: 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e   }.        keyIn
d510: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  fo.aColl[0] = sq
d520: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
d530: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
d540: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20  pLeft);..       
d550: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
d560: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
d570: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
d580: 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
d590: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
d5a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
d5b0: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
d5c0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
d5d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d5e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d5f0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
d600: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
d610: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
d620: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
d630: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
d640: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
d650: 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
d660: 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  xpr;..          
d670: 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
d680: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
d690: 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
d6a0: 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
d6b0: 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
d6c0: 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
d6d0: 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
d6e0: 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
d6f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
d700: 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
d710: 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
d720: 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
d730: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
d740: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
d750: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
d760: 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
d770: 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
d780: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
d790: 20 74 65 73 74 41 64 64 72 20 26 26 20 21 73 71   testAddr && !sq
d7a0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
d7b0: 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
d7c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d7d0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
d7e0: 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c 20 32  v, testAddr-1, 2
d7f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
d800: 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  estAddr = 0;.   
d810: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
d820: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
d830: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
d840: 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
d850: 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
d860: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 33   */.          r3
d870: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
d880: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
d890: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
d8a0: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
d8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d8c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8d0: 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
d8e0: 74 2c 20 72 33 2c 20 73 71 6c 69 74 65 33 56 64  t, r3, sqlite3Vd
d8f0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d900: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
d910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d920: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
d930: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
d940: 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
d950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d970: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
d980: 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
d990: 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
d9a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
d9b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
d9c0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
d9d0: 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20  Parse, r3, 1);. 
d9e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d9f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
da00: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
da10: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
da20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
da30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
da40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
da50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
da60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
da70: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
da80: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
da90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
daa0: 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  !isRowid ){.    
dab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
dac0: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
dad0: 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66   (void *)&keyInf
dae0: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
daf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
db00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
db10: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
db20: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
db30: 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
db40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
db50: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
db60: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
db70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
db80: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
db90: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
dba0: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
dbb0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
dbc0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
dbd0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
dbe0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
dbf0: 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69  lumn.  If this i
dc00: 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
dc10: 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  te.      ** an i
dc20: 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78  nteger 0 (not ex
dc30: 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73  ists) or 1 (exis
dc40: 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  ts) into a memor
dc50: 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  y cell.      ** 
dc60: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74 20  and record that 
dc70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
dc80: 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
dc90: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
dca0: 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20  nst Token one = 
dcb0: 7b 20 22 31 22 2c 20 31 20 7d 3b 20 20 2f 2a 20  { "1", 1 };  /* 
dcc0: 54 6f 6b 65 6e 20 66 6f 72 20 6c 69 74 65 72 61  Token for litera
dcd0: 6c 20 76 61 6c 75 65 20 31 20 2a 2f 0a 20 20 20  l value 1 */.   
dce0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
dd10: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
dd20: 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  encode */.      
dd30: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
dd60: 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74  deal with SELECt
dd70: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
dd80: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
dd90: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
dda0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ddb0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ddc0: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
ddd0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
dde0: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
ddf0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
de00: 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20  SELECT );..     
de10: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
de20: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
de30: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
de40: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
de50: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
de60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
de70: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
de80: 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
de90: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
dea0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
deb0: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
dec0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
ded0: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
dee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
def0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
df00: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
df10: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
df20: 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
df30: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
df40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df50: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
df60: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
df70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
df80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
df90: 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50  eger, 0, dest.iP
dfa0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
dfb0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
dfc0: 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
dfd0: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
dfe0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
dff0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
e000: 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
e010: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
e020: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
e030: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
e040: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e  TEGER, 0, 0, &on
e050: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  e);.      if( sq
e060: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e070: 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
e080: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e090: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
e0a0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
e0b0: 20 3d 20 28 69 31 36 29 64 65 73 74 2e 69 50 61   = (i16)dest.iPa
e0c0: 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
e0d0: 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
e0e0: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
e0f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e100: 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20  f( testAddr ){. 
e110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e120: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
e130: 64 72 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr-1);.  }.  sql
e140: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
e150: 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20  (pParse, 1);..  
e160: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
e170: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e180: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
e190: 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
e1a0: 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
e1b0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
e1c0: 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
e1d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
e1e0: 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
e1f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
e200: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
e210: 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
e220: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
e230: 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
e240: 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
e250: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e260: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
e270: 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
e280: 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
e290: 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
e2a0: 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
e2b0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
e2c0: 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
e2d0: 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
e2e0: 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
e2f0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
e300: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
e310: 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
e320: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
e330: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
e340: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
e350: 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
e360: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
e370: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
e380: 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
e390: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
e3a0: 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
e3b0: 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
e3c0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
e3d0: 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
e3e0: 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72   value;.    char
e3f0: 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65   *zV;.    sqlite
e400: 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29  3AtoF(z, &value)
e410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
e420: 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
e430: 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
e440: 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
e450: 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
e460: 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
e470: 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
e480: 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
e490: 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
e4a0: 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lue);.    sqlite
e4b0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
e4c0: 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
e4d0: 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
e4e0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
e4f0: 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
e500: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
e510: 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
e520: 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
e530: 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
e540: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
e550: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
e560: 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
e570: 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
e580: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
e590: 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
e5a0: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
e5b0: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
e5c0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
e5d0: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
e5e0: 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
e5f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
e600: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
e610: 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56  id codeInteger(V
e620: 64 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70 45  dbe *v, Expr *pE
e630: 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
e640: 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
e650: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
e660: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
e670: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
e680: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
e690: 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
e6a0: 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
e6b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e6c0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
e6d0: 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
e6e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e6f0: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
e700: 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ken;.    assert(
e710: 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   z!=0 );.    if(
e720: 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34   sqlite3FitsIn64
e730: 42 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67 29  Bits(z, negFlag)
e740: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 61   ){.      i64 va
e750: 6c 75 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20  lue;.      char 
e760: 2a 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  *zV;.      sqlit
e770: 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c  e3Atoi64(z, &val
e780: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ue);.      if( n
e790: 65 67 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  egFlag ) value =
e7a0: 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a   -value;.      z
e7b0: 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
e7c0: 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
e7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e7e0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49  beAddOp4(v, OP_I
e7f0: 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
e800: 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b  , zV, P4_INT64);
e810: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e820: 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
e830: 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
e840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e850: 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68  .** Clear a cach
e860: 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  e entry..*/.stat
e870: 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74  ic void cacheEnt
e880: 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  ryClear(Parse *p
e890: 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43  Parse, struct yC
e8a0: 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69  olCache *p){.  i
e8b0: 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b  f( p->tempReg ){
e8c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
e8d0: 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
e8e0: 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
e8f0: 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70  pReg) ){.      p
e900: 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
e910: 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
e920: 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  ++] = p->iReg;. 
e930: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70     }.    p->temp
e940: 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Reg = 0;.  }.}..
e950: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e  ./*.** Record in
e960: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
e970: 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75  e that a particu
e980: 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  lar column from 
e990: 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20  a.** particular 
e9a0: 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20  table is stored 
e9b0: 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
e9c0: 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  register..*/.voi
e9d0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
e9e0: 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70  heStore(Parse *p
e9f0: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c  Parse, int iTab,
ea00: 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69   int iCol, int i
ea10: 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
ea20: 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69   int minLru;.  i
ea30: 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72  nt idxLru;.  str
ea40: 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
ea50: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  ;..  assert( iRe
ea60: 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67 69 73  g>0 );  /* Regis
ea70: 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
ea80: 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 20  always positive 
ea90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  */.  assert( iCo
eaa0: 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
eab0: 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
eac0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
ead0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20   */..  /* First 
eae0: 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
eaf0: 74 69 6e 67 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ting entry */.  
eb00: 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
eb10: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
eb20: 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
eb30: 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
eb40: 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
eb50: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
eb60: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
eb70: 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  iCol ){.      ca
eb80: 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
eb90: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
eba0: 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
ebb0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
ebc0: 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
ebd0: 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e   iReg;.      p->
ebe0: 61 66 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  affChange = 0;. 
ebf0: 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
ec00: 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
ec10: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
ec20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ec30: 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
ec40: 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
ec50: 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
ec60: 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
ec70: 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
ec80: 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
ec90: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
eca0: 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
ecb0: 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
ecc0: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
ecd0: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
ece0: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
ecf0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
ed00: 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
ed10: 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
ed20: 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 30  p->affChange = 0
ed30: 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  ;.      p->tempR
ed40: 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  eg = 0;.      p-
ed50: 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
ed60: 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
ed70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ed80: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63    }..  /* Replac
ed90: 65 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e  e the last recen
eda0: 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69  tly used */.  mi
edb0: 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66  nLru = 0x7ffffff
edc0: 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31  f;.  idxLru = -1
edd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
ede0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
edf0: 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
ee00: 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
ee10: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75  {.    if( p->lru
ee20: 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20  <minLru ){.     
ee30: 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20   idxLru = i;.   
ee40: 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
ee50: 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ru;.    }.  }.  
ee60: 69 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72  if( ALWAYS(idxLr
ee70: 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d  u>=0) ){.    p =
ee80: 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
ee90: 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20  che[idxLru];.   
eea0: 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
eeb0: 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
eec0: 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20  ;.    p->iTable 
eed0: 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69  = iTab;.    p->i
eee0: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
eef0: 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
ef00: 67 3b 0a 20 20 20 20 70 2d 3e 61 66 66 43 68 61  g;.    p->affCha
ef10: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  nge = 0;.    p->
ef20: 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
ef30: 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
ef40: 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
ef50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d     return;.  }.}
ef60: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
ef70: 20 74 68 61 74 20 61 20 72 65 67 69 73 74 65 72   that a register
ef80: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 77 72   is being overwr
ef90: 69 74 74 65 6e 2e 20 20 50 75 72 67 65 20 74 68  itten.  Purge th
efa0: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 66 72  e register.** fr
efb0: 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
efc0: 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
efd0: 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
efe0: 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
eff0: 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
f000: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
f010: 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
f020: 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
f030: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
f040: 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
f050: 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
f060: 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
f070: 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Reg ){.      cac
f080: 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
f090: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
f0a0: 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
f0b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
f0c0: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
f0d0: 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
f0e0: 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
f0f0: 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
f100: 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
f110: 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
f120: 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
f130: 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
f140: 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
f150: 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
f160: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
f170: 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
f180: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
f190: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
f1a0: 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  el++;.}../*.** R
f1b0: 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63  emove from the c
f1c0: 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20  olumn cache any 
f1d0: 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72  entries that wer
f1e0: 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68  e added since th
f1f0: 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  e.** the previou
f200: 73 20 4e 20 50 75 73 68 20 6f 70 65 72 61 74 69  s N Push operati
f210: 6f 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ons.  In other w
f220: 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 20 74 68  ords, restore th
f230: 65 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68  e cache.** to th
f240: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
f250: 6e 20 4e 20 50 75 73 68 65 73 20 61 67 6f 2e 0a  n N Pushes ago..
f260: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
f270: 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73  xprCachePop(Pars
f280: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 4e  e *pParse, int N
f290: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
f2a0: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
f2b0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  p;.  assert( N>0
f2c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f2d0: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
f2e0: 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=N );.  pParse
f2f0: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d  ->iCacheLevel -=
f300: 20 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   N;.  for(i=0, p
f310: 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
f320: 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
f330: 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
f340: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
f350: 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c  Reg && p->iLevel
f360: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
f370: 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
f380: 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
f390: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
f3a0: 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
f3b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
f3c0: 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f  When a cached co
f3d0: 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20  lumn is reused, 
f3e0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69  make sure that i
f3f0: 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ts register is.*
f400: 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69  * no longer avai
f410: 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20  lable as a temp 
f420: 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65  register.  ticke
f430: 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73  t #3879:  that s
f440: 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ame.** register 
f450: 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20  might be in the 
f460: 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c  cache in multipl
f470: 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20  e places, so be 
f480: 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74  sure to.** get t
f490: 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  hem all..*/.stat
f4a0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
f4b0: 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
f4c0: 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
f4d0: 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
f4e0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
f4f0: 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
f500: 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
f510: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
f520: 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
f530: 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
f540: 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
f550: 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
f560: 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
f570: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
f580: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f590: 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
f5a0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
f5b0: 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
f5c0: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
f5d0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
f5e0: 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
f5f0: 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
f600: 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
f610: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
f620: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
f630: 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
f640: 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
f650: 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
f660: 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
f670: 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
f680: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
f690: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
f6a0: 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
f6b0: 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
f6c0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
f6d0: 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
f6e0: 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
f6f0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
f700: 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
f710: 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  owid..**.** This
f720: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61   routine might a
f730: 74 74 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20  ttempt to reuse 
f740: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
f750: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20   column that.** 
f760: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
f770: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72   loaded into a r
f780: 65 67 69 73 74 65 72 2e 20 20 54 68 65 20 76 61  egister.  The va
f790: 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a  lue will always.
f7a0: 2a 2a 20 62 65 20 75 73 65 64 20 69 66 20 69 74  ** be used if it
f7b0: 20 68 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f   has not undergo
f7c0: 6e 65 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20  ne any affinity 
f7d0: 63 68 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66  changes.  But if
f7e0: 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20  .** an affinity 
f7f0: 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
f800: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61  red, then the ca
f810: 63 68 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ched value will 
f820: 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20  only be.** used 
f830: 69 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20  if allowAffChng 
f840: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  is true..*/.int 
f850: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
f860: 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
f870: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
f880: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
f890: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
f8a0: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
f8b0: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
f8c0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
f8d0: 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
f8e0: 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
f8f0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
f900: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
f910: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
f920: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
f930: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
f940: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
f950: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
f960: 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
f970: 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
f980: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f  re */.  int allo
f990: 77 41 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65  wAffChng /* True
f9a0: 20 69 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69   if prior affini
f9b0: 74 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f  ty changes are O
f9c0: 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  K */.){.  Vdbe *
f9d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f9e0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
f9f0: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
fa00: 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
fa10: 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
fa20: 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
fa30: 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
fa40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
fa50: 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
fa60: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
fa70: 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
fa80: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  n.           && 
fa90: 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 7c  (!p->affChange |
faa0: 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 29 20  | allowAffChng) 
fab0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
fac0: 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
fad0: 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
fae0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
faf0: 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
fb00: 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
fb10: 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
fb20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
fb30: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
fb40: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
fb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fb60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
fb70: 77 69 64 2c 20 69 54 61 62 6c 65 2c 20 69 52 65  wid, iTable, iRe
fb80: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
fb90: 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20  ALWAYS(pTab!=0) 
fba0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
fbb0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
fbc0: 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
fbd0: 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
fbe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fbf0: 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
fc00: 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
fc10: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
fc20: 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
fc30: 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
fc40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
fc50: 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
fc60: 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
fc70: 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 72  lumn, iReg);.  r
fc80: 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
fc90: 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  *.** Clear all c
fca0: 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72  olumn cache entr
fcb0: 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ies..*/.void sql
fcc0: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
fcd0: 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
fce0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
fcf0: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
fd00: 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
fd10: 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
fd20: 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
fd30: 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
fd40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
fd50: 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Reg ){.      cac
fd60: 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
fd70: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
fd80: 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
fd90: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
fda0: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
fdb0: 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20  hat an affinity 
fdc0: 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
fdd0: 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a  red on iCount.**
fde0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
fdf0: 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e  ing with iStart.
fe00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fe10: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
fe20: 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70  yChange(Parse *p
fe30: 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72  Parse, int iStar
fe40: 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a  t, int iCount){.
fe50: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 53 74    int iEnd = iSt
fe60: 61 72 74 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31  art + iCount - 1
fe70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
fe80: 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
fe90: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
fea0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
feb0: 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
fec0: 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
fed0: 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
fee0: 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
fef0: 3e 3d 69 53 74 61 72 74 20 26 26 20 72 3c 3d 69  >=iStart && r<=i
ff00: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  End ){.      p->
ff10: 61 66 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20  affChange = 1;. 
ff20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ff30: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ff40: 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
ff50: 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
ff60: 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
ff70: 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
ff80: 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
ff90: 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
ffa0: 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
ffb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ffc0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
ffd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
ffe0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
fff0: 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
10000 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
10010 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69 66  olCache *p;.  if
10020 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69  ( NEVER(iFrom==i
10030 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  To) ) return;.  
10040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10050 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
10060 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
10070 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66   iTo, nReg);.  f
10080 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
10090 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
100a0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
100b0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
100c0 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67   int x = p->iReg
100d0 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72  ;.    if( x>=iFr
100e0 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52  om && x<iFrom+nR
100f0 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  eg ){.      p->i
10100 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d  Reg += iTo-iFrom
10110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10120 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
10130 64 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65  de to copy conte
10140 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
10150 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
10160 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
10170 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
10180 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  1..*/.void sqlit
10190 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
101a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
101b0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
101c0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
101d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt i;.  if( NEVE
101e0 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20  R(iFrom==iTo) ) 
101f0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
10200 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b  0; i<nReg; i++){
10210 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10220 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
10230 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  Vdbe, OP_Copy, i
10240 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a  From+i, iTo+i);.
10250 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
10260 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
10270 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
10280 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
10290 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
102a0 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
102b0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
102c0 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  che..*/.static i
102d0 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
102e0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
102f0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
10300 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
10310 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
10320 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
10330 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
10340 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
10350 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
10360 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
10370 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
10380 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
10390 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
103a0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
103b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
103c0 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
103d0 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20 61  ction coded is a
103e0 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70 79  n ephemeral copy
103f0 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68   of any of.** th
10400 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 74  e registers in t
10410 68 65 20 6e 52 65 67 20 72 65 67 69 73 74 65 72  he nReg register
10420 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
10430 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63   iReg, then.** c
10440 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74 20  onvert the last 
10450 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d  instruction from
10460 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f   OP_SCopy to OP_
10470 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Copy..*/.void sq
10480 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70  lite3ExprHardCop
10490 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
104a0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
104b0 52 65 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Reg){.  VdbeOp *
104c0 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  pOp;.  Vdbe *v;.
104d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
104e0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
104f0 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 76 20 3d 20  led==0 );.  v = 
10500 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
10510 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10520 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33  .  pOp = sqlite3
10530 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29  VdbeGetOp(v, -1)
10540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 21  ;.  assert( pOp!
10550 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
10560 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70  >opcode==OP_SCop
10570 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d 69 52  y && pOp->p1>=iR
10580 65 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c 69 52  eg && pOp->p1<iR
10590 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 70  eg+nReg ){.    p
105a0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
105b0 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Copy;.  }.}../*.
105c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
105d0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61   to store the va
105e0 6c 75 65 20 6f 66 20 74 68 65 20 69 41 6c 69 61  lue of the iAlia
105f0 73 2d 74 68 20 61 6c 69 61 73 20 69 6e 20 72 65  s-th alias in re
10600 67 69 73 74 65 72 0a 2a 2a 20 74 61 72 67 65 74  gister.** target
10610 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
10620 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  e this is called
10630 2c 20 70 45 78 70 72 20 69 73 20 65 76 61 6c 75  , pExpr is evalu
10640 61 74 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a  ated to compute.
10650 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
10660 74 68 65 20 61 6c 69 61 73 2e 20 20 54 68 65 20  the alias.  The 
10670 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20  value is stored 
10680 69 6e 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  in an auxiliary 
10690 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
106a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
106b0 61 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72  at register is r
106c0 65 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73 75 62  eturned.  On sub
106d0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 0a 2a  sequent calls,.*
106e0 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  * the register n
106f0 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e 65  umber is returne
10700 64 20 77 69 74 68 6f 75 74 20 67 65 6e 65 72 61  d without genera
10710 74 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e 0a 2a  ting any code..*
10720 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
10730 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  n order for this
10740 20 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65 20 6d   to work, code m
10750 75 73 74 20 62 65 20 67 65 6e 65 72 61 74 65 64  ust be generated
10760 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   in the.** same 
10770 6f 72 64 65 72 20 74 68 61 74 20 69 74 20 69 73  order that it is
10780 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a   executed..**.**
10790 20 41 6c 69 61 73 65 73 20 61 72 65 20 6e 75 6d   Aliases are num
107a0 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 77  bered starting w
107b0 69 74 68 20 31 2e 20 20 53 6f 20 69 41 6c 69 61  ith 1.  So iAlia
107c0 73 20 69 73 20 69 6e 20 74 68 65 20 72 61 6e 67  s is in the rang
107d0 65 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70 50 61  e.** of 1 to pPa
107e0 72 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e 63 6c  rse->nAlias incl
107f0 75 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 70  usive.  .**.** p
10800 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41  Parse->aAlias[iA
10810 6c 69 61 73 2d 31 5d 20 72 65 63 6f 72 64 73 20  lias-1] records 
10820 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
10830 62 65 72 20 77 68 65 72 65 20 74 68 65 20 76 61  ber where the va
10840 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 41  lue.** of the iA
10850 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69 73  lias-th alias is
10860 20 73 74 6f 72 65 64 2e 20 20 49 66 20 7a 65 72   stored.  If zer
10870 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
10880 61 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  at the.** alias 
10890 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
108a0 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74   computed..*/.st
108b0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 69  atic int codeAli
108c0 61 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  as(Parse *pParse
108d0 2c 20 69 6e 74 20 69 41 6c 69 61 73 2c 20 45 78  , int iAlias, Ex
108e0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
108f0 61 72 67 65 74 29 7b 0a 23 69 66 20 30 0a 20 20  arget){.#if 0.  
10900 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10910 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
10920 69 52 65 67 3b 0a 20 20 69 66 28 20 70 50 61 72  iReg;.  if( pPar
10930 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3c  se->nAliasAlloc<
10940 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29  pParse->nAlias )
10950 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41  {.    pParse->aA
10960 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
10970 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62  ReallocOrFree(db
10980 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73  , pParse->aAlias
10990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65     sizeof(pParse
109c0 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70 50 61  ->aAlias[0])*pPa
109d0 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20  rse->nAlias );. 
109e0 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
109f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
10a00 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41   pParse->nAliasA
10a10 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20 20 69 66  lloc>0 );.    if
10a20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
10a30 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
10a40 20 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73     memset(&pPars
10a50 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61 72 73 65  e->aAlias[pParse
10a60 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 5d 2c 20  ->nAliasAlloc], 
10a70 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  0,.           (p
10a80 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 2d 70 50  Parse->nAlias-pP
10a90 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f  arse->nAliasAllo
10aa0 63 29 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  c)*sizeof(pParse
10ab0 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29 3b 0a 20  ->aAlias[0]));. 
10ac0 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61     pParse->nAlia
10ad0 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72 73 65 2d  sAlloc = pParse-
10ae0 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 61  >nAlias;.  }.  a
10af0 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e 30 20  ssert( iAlias>0 
10b00 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61 72 73  && iAlias<=pPars
10b10 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20 69  e->nAlias );.  i
10b20 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  Reg = pParse->aA
10b30 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 3b 0a  lias[iAlias-1];.
10b40 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20 29 7b    if( iReg==0 ){
10b50 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
10b60 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 30 20 29  >iCacheLevel>0 )
10b70 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20 73  {.      iReg = s
10b80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
10b90 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
10ba0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
10bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
10bc0 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
10bd0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
10be0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10bf0 65 2c 20 70 45 78 70 72 2c 20 69 52 65 67 29 3b  e, pExpr, iReg);
10c00 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
10c10 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20  Alias[iAlias-1] 
10c20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  = iReg;.    }.  
10c30 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
10c40 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
10c50 50 41 52 41 4d 45 54 45 52 28 69 41 6c 69 61 73  PARAMETER(iAlias
10c60 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
10c70 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
10c80 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
10c90 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
10ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
10cb0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
10cc0 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
10cd0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
10ce0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
10cf0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
10d00 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
10d10 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
10d20 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
10d30 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
10d40 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
10d50 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
10d60 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
10d70 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
10d80 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
10d90 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
10da0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
10db0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
10dc0 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
10dd0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
10de0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
10df0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
10e00 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
10e10 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
10e20 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
10e30 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
10e40 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
10e50 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
10e60 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
10e70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10e80 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
10e90 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10ea0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
10eb0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10ec0 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
10ed0 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
10ee0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
10ef0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
10f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
10f10 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
10f20 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
10f30 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
10f40 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
10f50 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
10f60 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
10f70 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
10f80 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
10f90 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
10fa0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
10fb0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
10fc0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
10fd0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
10fe0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
10ff0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
11000 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20  int r1, r2, r3, 
11010 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72  r4;       /* Var
11020 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
11030 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
11040 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11050 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
11060 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11070 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  */..  assert( ta
11080 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
11090 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
110a0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
110b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
110c0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
110d0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
110e0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
110f0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
11100 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
11110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
11120 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
11130 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
11140 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
11150 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
11160 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
11170 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
11180 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
11190 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
111a0 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
111b0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
111c0 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
111d0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
111e0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
111f0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
11200 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
11210 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
11220 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
11230 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11240 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
11250 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
11260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11270 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
11280 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
11290 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
112c0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
112d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
112e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
112f0 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
11300 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
11310 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
11320 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
11330 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
11340 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
11350 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
11360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
11370 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
11380 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
11390 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
113a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
113b0 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
113c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
113d0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
113e0 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
113f0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
11400 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
11410 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  ( (pExpr->flags 
11420 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d 30 20  & EP_AnyAff)!=0 
11430 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
11440 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11450 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
11460 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
11470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
114a0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
114b0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
114e0 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
114f0 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
11500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11510 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
11520 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
11530 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78 70  eInteger(v, pExp
11540 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
11550 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11560 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
11570 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
11580 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
11590 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
115a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
115b0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
115c0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
115d0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
115e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
115f0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
11600 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
11610 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
11620 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
11630 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
11640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11650 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
11660 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  , 0, target, 0, 
11670 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
11680 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
11690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
116a0 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
116b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
116c0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
116d0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
116e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
116f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11700 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
11710 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
11720 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
11730 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11740 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
11750 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
11760 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11770 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
11780 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
11790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
117a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
117b0 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
117c0 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
117d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
117e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
117f0 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
11800 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
11810 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
11820 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
11830 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
11840 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
11850 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
11860 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
11870 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
11880 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
11890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
118a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
118b0 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
118c0 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
118d0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
118e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
118f0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
11900 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
11910 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
11920 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
11930 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
11940 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
11950 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
11960 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
11970 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
11980 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
11990 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
119a0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
119b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 30 0a  >u.zToken[1]==0.
119c0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70           && (pOp
119d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
119e0 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
119f0 6f 64 65 3d 3d 4f 50 5f 56 61 72 69 61 62 6c 65  ode==OP_Variable
11a00 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
11a10 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 3d 3d 70 45  ->p1+pOp->p3==pE
11a20 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  xpr->iTable.    
11a30 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
11a40 70 4f 70 2d 3e 70 33 3d 3d 74 61 72 67 65 74 0a  pOp->p3==target.
11a50 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
11a60 3e 70 34 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 29  >p4.z==0.      )
11a70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
11a80 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
11a90 74 72 75 63 74 69 6f 6e 20 77 61 73 20 61 20 63  truction was a c
11aa0 6f 70 79 20 6f 66 20 74 68 65 20 70 72 65 76 69  opy of the previ
11ab0 6f 75 73 20 75 6e 6e 61 6d 65 64 0a 20 20 20 20  ous unnamed.    
11ac0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
11ad0 20 69 6e 74 6f 20 74 68 65 20 70 72 65 76 69 6f   into the previo
11ae0 75 73 20 72 65 67 69 73 74 65 72 2c 20 74 68 65  us register, the
11af0 6e 20 73 69 6d 70 6c 79 20 69 6e 63 72 65 6d 65  n simply increme
11b00 6e 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  nt the.        *
11b10 2a 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20 6f  * repeat count o
11b20 6e 20 74 68 65 20 70 72 69 6f 72 20 69 6e 73 74  n the prior inst
11b30 72 75 63 74 69 6f 6e 20 72 61 74 68 65 72 20 74  ruction rather t
11b40 68 61 6e 20 6d 61 6b 69 6e 67 20 61 20 6e 65 77  han making a new
11b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  .        ** inst
11b60 72 75 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruction..       
11b70 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   */.        pOp-
11b80 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  >p3++;.      }el
11b90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
11ba0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11bb0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
11bc0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
11bd0 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
11be0 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54   if( pExpr->u.zT
11bf0 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20  oken[1]!=0 ){.  
11c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11c10 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
11c20 31 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  1, pExpr->u.zTok
11c30 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  en, 0);.        
11c40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11c50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11c60 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
11c70 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
11c80 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
11c90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11ca0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11cb0 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
11cc0 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70  eg = codeAlias(p
11cd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 69 54  Parse, pExpr->iT
11ce0 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  able, pExpr->pLe
11cf0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
11d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11d10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11d20 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
11d30 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
11d40 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
11d50 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
11d60 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
11d70 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
11d80 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20  nt aff, to_op;. 
11d90 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
11da0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
11db0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
11dc0 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
11dd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11de0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
11df0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
11e00 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66  lue) );.      af
11e10 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
11e20 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
11e30 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
11e40 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
11e50 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
11e60 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
11e70 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11e80 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
11e90 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11ea0 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
11eb0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11ec0 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
11ed0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11ee0 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
11ef0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11f00 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
11f10 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11f20 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
11f30 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11f40 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
11f50 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11f60 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
11f70 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11f80 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
11f90 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11fa0 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
11fb0 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
11fc0 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20  ==OP_ToText );. 
11fd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
11fe0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
11ff0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12000 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  e( to_op==OP_ToN
12010 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20  umeric );.      
12020 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
12030 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20  =OP_ToInt );.   
12040 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
12050 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b  op==OP_ToReal );
12060 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
12070 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
12080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
120a0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
120b0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
120c0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
120d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
120e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f  VdbeAddOp1(v, to
120f0 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  _op, inReg);.   
12100 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65     testcase( use
12110 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
12120 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e  Parse, inReg, in
12130 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71  Reg) );.      sq
12140 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
12150 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
12160 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a  rse, inReg, 1);.
12170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12180 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
12190 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
121a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
121b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
121c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
121d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
121e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
121f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
12200 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
12210 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
12220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
12230 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
12240 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12250 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
12260 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
12270 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
12280 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
12290 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
122a0 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
122b0 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
122c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
122d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
122e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
122f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12300 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
12310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12320 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
12330 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12340 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
12350 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
12360 45 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  E );.      codeC
12370 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70  ompareOperands(p
12380 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12390 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72  eft, &r1, &regFr
123a0 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ee1,.           
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52         pExpr->pR
123d0 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46  ight, &r2, &regF
123e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
123f0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
12400 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
12410 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
12420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12430 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
12440 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
12450 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
12460 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
12470 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12480 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
12490 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
124a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
124b0 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
124c0 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
124d0 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
124e0 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
124f0 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
12500 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
12510 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
12520 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
12530 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
12540 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
12550 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
12560 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
12570 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
12580 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
12590 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
125a0 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
125b0 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
125c0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
125d0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
125e0 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dd );.      asse
125f0 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
12600 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20  _Subtract );.   
12610 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
12620 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
12630 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12640 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
12650 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  itAnd );.      a
12660 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
12670 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20  =OP_BitOr );.   
12680 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
12690 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
126a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
126b0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
126c0 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  iftLeft );.     
126d0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
126e0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
126f0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
12700 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
12710 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20  _Concat );.     
12720 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12730 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74  K_AND );.      t
12740 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12750 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OR );.      test
12760 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
12770 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
12780 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
12790 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
127a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
127b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
127c0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
127d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
127e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52  se( op==TK_BITOR
127f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12800 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
12810 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12820 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
12830 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
12840 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
12850 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
12860 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
12870 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
12880 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12890 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
128a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
128b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
128c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
128d0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
128e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
128f0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
12900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12910 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
12920 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12930 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
12940 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
12950 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
12960 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
12970 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
12980 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
12990 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
129a0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
129b0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
129c0 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
129d0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
129e0 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
129f0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
12a00 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
12a10 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
12a20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
12a30 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
12a40 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
12a50 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
12a60 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
12a70 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
12a80 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
12a90 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  (v, pLeft, 1, ta
12aa0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
12ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46  se{.        regF
12ac0 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69  ree1 = r1 = sqli
12ad0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
12ae0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
12af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12b00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12b10 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  0, r1);.        
12b20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
12b30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
12b40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
12b50 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
12b60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12b70 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
12b80 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
12b90 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
12ba0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
12bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
12bc0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
12bd0 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
12be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
12bf0 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
12c00 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
12c10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12c20 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
12c30 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
12c40 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
12c50 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
12c60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
12c70 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
12c80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
12c90 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
12ca0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
12cb0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
12cc0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
12cd0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
12ce0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
12cf0 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
12d00 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
12d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d20 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
12d30 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
12d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
12d50 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
12d60 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
12d70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
12d80 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
12d90 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
12da0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
12db0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
12dc0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
12dd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12de0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
12df0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12e00 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
12e10 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
12e20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12e30 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
12e40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
12e50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12e60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
12e70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
12e80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
12e90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
12ea0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
12eb0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
12ec0 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
12ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12ee0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12ef0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
12f00 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
12f10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12f20 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
12f30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12f40 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
12f50 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
12f60 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
12f70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
12f80 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
12f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
12fa0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
12fb0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
12fc0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
12fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12fe0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
12ff0 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
13000 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
13010 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
13020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13030 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
13040 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
13050 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
13060 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13070 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13080 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
13090 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
130a0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
130b0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
130c0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
130d0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
130e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
130f0 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
13100 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
13110 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
13120 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
13130 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
13140 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
13150 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
13160 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
13170 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
13180 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
13190 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
131a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
131b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
131c0 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
131d0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
131e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  /.      int cons
131f0 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
13200 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
13210 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
13220 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
13230 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13250 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
13260 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
13270 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
13280 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
13290 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
132a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
132b0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
132c0 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
132d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
132e0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
132f0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
13300 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
13310 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
13320 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
13330 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29  =TK_CONST_FUNC )
13340 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13350 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ( op==TK_FUNCTIO
13360 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
13370 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
13380 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
13390 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
133a0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
133b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
133c0 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
133d0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
133e0 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
133f0 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
13400 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
13410 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13420 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13430 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13440 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
13450 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
13460 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33     nId = sqlite3
13470 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20  Strlen30(zId);. 
13480 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
13490 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
134a0 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46  db, zId, nId, nF
134b0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
134c0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
134d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
134e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
134f0 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
13500 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e  tion: %.*s()", n
13510 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
13520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
13530 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
13540 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   ){.        r1 =
13550 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13560 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
13570 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rg);.        sql
13580 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
13590 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
135a0 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  rg, r1, 1);.    
135b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
135c0 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
135d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
135e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
135f0 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
13600 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
13610 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
13620 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
13630 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
13640 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
13650 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
13660 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
13670 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
13680 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
13690 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
136a0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
136b0 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
136c0 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
136d0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
136e0 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
136f0 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
13700 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
13710 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
13720 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
13730 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
13740 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
13750 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
13760 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
13770 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
13780 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
13790 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
137a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
137b0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
137c0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
137d0 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
137e0 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
137f0 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
13800 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
13810 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
13820 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
13830 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
13840 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
13850 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
13860 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
13870 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
13880 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
13890 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
138a0 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
138b0 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
138c0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
138d0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
138e0 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
138f0 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
13900 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
13910 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
13920 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
13930 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
13940 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
13950 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
13960 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
13970 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
13980 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13990 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
139a0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
139b0 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
139c0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
139d0 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
139e0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
139f0 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
13a00 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
13a10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
13a20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
13a30 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
13a40 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
13a50 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
13a60 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13a70 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13a80 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
13a90 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
13aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13ab0 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20  ( pDef->flags & 
13ac0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
13ad0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
13ae0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
13af0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
13b00 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
13b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13b20 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
13b30 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
13b40 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
13b50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13b70 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
13b80 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  n, constMask, r1
13b90 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
13bc0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
13bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13be0 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
13bf0 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
13c00 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
13c10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
13c20 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
13c30 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
13c40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13c50 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
13c60 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
13c70 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
13c80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13c90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ca0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
13cb0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
13cc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
13cd0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ECT: {.      tes
13ce0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
13cf0 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
13d00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
13d10 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 73  ELECT );.      s
13d20 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
13d30 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
13d40 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
13d50 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
13d60 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72  Column;.      br
13d70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13d80 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
13d90 20 20 20 69 6e 74 20 72 4e 6f 74 46 6f 75 6e 64     int rNotFound
13da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
13db0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
13dc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 32 2c 20  ;.      int j2, 
13dd0 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20  j3, j4, j5;.    
13de0 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
13df0 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65  .      int eType
13e00 3b 0a 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  ;..      VdbeNoo
13e10 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
13e20 67 69 6e 20 49 4e 20 65 78 70 72 20 72 25 64 22  gin IN expr r%d"
13e30 2c 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20  , target));.    
13e40 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
13e50 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
13e60 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 4d 61  rse, pExpr, &rMa
13e70 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
13e80 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
13e90 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 4e  ll ){.        rN
13ea0 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72  otFound = ++pPar
13eb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
13ec0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  }..      /* Figu
13ed0 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
13ee0 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
13ef0 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
13f00 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
13f10 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
13f20 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
13f30 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
13f40 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
13f50 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
13f60 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
13f70 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
13f80 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
13f90 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
13fa0 74 79 28 70 45 78 70 72 29 3b 0a 0a 0a 20 20 20  ty(pExpr);...   
13fb0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c     /* Code the <
13fc0 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
13fd0 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68  r> IN (...)". Th
13fe0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
13ff0 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72  e.      ** pExpr
14000 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ->iTable contain
14010 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
14020 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e  t make up the (.
14030 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a  ..) set..      *
14040 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
14050 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
14060 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
14070 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14080 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14090 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
140a0 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
140b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
140c0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 29 3b 0a 20  Null, target);. 
140d0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
140e0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
140f0 7b 0a 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73  {.        j3 = s
14100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14110 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
14120 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14130 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56     j4 = sqlite3V
14140 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14150 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72  NotExists, pExpr
14160 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 74 61 72  ->iTable, 0, tar
14170 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
14180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14190 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
141a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
141b0 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56     j5 = sqlite3V
141c0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
141d0 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Goto);.        s
141e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
141f0 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20  re(v, j3);.     
14200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14210 6d 70 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20  mpHere(v, j4);. 
14220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14230 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14240 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
14250 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
14260 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 72 65  .        r2 = re
14270 67 46 72 65 65 32 20 3d 20 73 71 6c 69 74 65 33  gFree2 = sqlite3
14280 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
14290 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
142a0 43 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  Create a record 
142b0 61 6e 64 20 74 65 73 74 20 66 6f 72 20 73 65 74  and test for set
142c0 20 6d 65 6d 62 65 72 73 68 69 70 2e 20 49 66 20   membership. If 
142d0 74 68 65 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  the set contains
142e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
142f0 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75 6d 70  value, then jump
14300 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14310 68 65 20 74 65 73 74 20 63 6f 64 65 2e 20 54 68  he test code. Th
14320 65 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 20  e target.       
14330 20 2a 2a 20 72 65 67 69 73 74 65 72 20 73 74 69   ** register sti
14340 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ll contains the 
14350 74 72 75 65 20 28 31 29 20 76 61 6c 75 65 20 77  true (1) value w
14360 72 69 74 74 65 6e 20 74 6f 20 69 74 20 65 61 72  ritten to it ear
14370 6c 69 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lier..        */
14380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14390 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
143a0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 74 61 72  _MakeRecord, tar
143b0 67 65 74 2c 20 31 2c 20 72 32 2c 20 26 61 66 66  get, 1, r2, &aff
143c0 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
143d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
143e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
143f0 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
14400 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73 71 6c          j5 = sql
14410 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14420 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
14430 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 32  r->iTable, 0, r2
14440 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  );..        /* I
14450 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
14460 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
14470 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
14480 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 20   of the .       
14490 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22   ** "x IN (...)"
144a0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
144b0 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20   be either 0 or 
144c0 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74  NULL. If the set
144d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
144e0 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  ains no NULL val
144f0 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
14500 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68  sult is 0. If th
14510 65 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  e set .        *
14520 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
14530 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
14540 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
14550 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ult of the.     
14560 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
14570 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20   is also NULL.. 
14580 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14590 20 20 69 66 28 20 72 4e 6f 74 46 6f 75 6e 64 3d    if( rNotFound=
145a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
145b0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
145c0 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f  uns if it is kno
145d0 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  wn at compile ti
145e0 6d 65 20 28 6e 6f 77 29 20 74 68 61 74 20 0a 20  me (now) that . 
145f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
14600 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  set contains no 
14610 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69  NULL values. Thi
14620 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68 65  s happens as the
14630 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20   result.        
14640 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e    ** of a "NOT N
14650 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
14660 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
14670 73 63 68 65 6d 61 2e 20 4e 6f 20 6e 65 65 64 0a  schema. No need.
14680 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
14690 74 65 73 74 20 74 68 65 20 64 61 74 61 20 73 74  test the data st
146a0 72 75 63 74 75 72 65 20 61 74 20 72 75 6e 74 69  ructure at runti
146b0 6d 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  me in this case.
146c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
146d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
146e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
146f0 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
14700 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
14710 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
14720 20 54 68 69 73 20 62 6c 6f 63 6b 20 70 6f 70 75   This block popu
14730 6c 61 74 65 73 20 74 68 65 20 72 4e 6f 74 46 6f  lates the rNotFo
14740 75 6e 64 20 72 65 67 69 73 74 65 72 20 77 69 74  und register wit
14750 68 20 65 69 74 68 65 72 20 4e 55 4c 4c 0a 20 20  h either NULL.  
14760 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 30 20          ** or 0 
14770 28 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75  (an integer valu
14780 65 29 2e 20 49 66 20 74 68 65 20 64 61 74 61 20  e). If the data 
14790 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
147a0 6e 73 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  ns one.         
147b0 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c   ** or more NULL
147c0 73 2c 20 74 68 65 6e 20 73 65 74 20 72 4e 6f 74  s, then set rNot
147d0 46 6f 75 6e 64 20 74 6f 20 4e 55 4c 4c 2e 20 4f  Found to NULL. O
147e0 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 69 74  therwise, set it
147f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
14800 20 30 2e 20 49 66 20 72 65 67 69 73 74 65 72 20   0. If register 
14810 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
14820 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 73  already set to s
14830 6f 6d 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ome value.      
14840 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 74 68 61      ** other tha
14850 6e 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  n NULL, then the
14860 20 74 65 73 74 20 68 61 73 20 61 6c 72 65 61 64   test has alread
14870 79 20 62 65 65 6e 20 72 75 6e 20 61 6e 64 20 0a  y been run and .
14880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 4e 6f            ** rNo
14890 74 46 6f 75 6e 64 20 69 73 20 61 6c 72 65 61 64  tFound is alread
148a0 79 20 70 6f 70 75 6c 61 74 65 64 2e 0a 20 20 20  y populated..   
148b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
148c0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
148d0 20 63 68 61 72 20 6e 75 6c 6c 52 65 63 6f 72 64   char nullRecord
148e0 5b 5d 20 3d 20 7b 20 30 78 30 32 2c 20 30 78 30  [] = { 0x02, 0x0
148f0 30 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  0 };.          j
14900 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  3 = sqlite3VdbeA
14910 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
14920 75 6c 6c 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  ull, rMayHaveNul
14930 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  l);.          sq
14940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14950 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
14960 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20  NotFound);.     
14970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14980 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
14990 62 2c 20 32 2c 20 72 4d 61 79 48 61 76 65 4e 75  b, 2, rMayHaveNu
149a0 6c 6c 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ll, 0, .        
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 20 20 20 6e 75 6c 6c 52 65 63 6f 72 64 2c       nullRecord,
149d0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
149e0 20 20 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69         j4 = sqli
149f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14a00 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
14a10 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 4d 61  ->iTable, 0, rMa
14a20 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
14a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14a40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
14a50 74 65 67 65 72 2c 20 30 2c 20 72 4e 6f 74 46 6f  teger, 0, rNotFo
14a60 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  und);.          
14a70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14a80 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20  ere(v, j4);.    
14a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14aa0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29  eJumpHere(v, j3)
14ab0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
14ac0 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 20 6f  Copy the value o
14ad0 66 20 72 65 67 69 73 74 65 72 20 72 4e 6f 74 46  f register rNotF
14ae0 6f 75 6e 64 20 28 77 68 69 63 68 20 69 73 20 65  ound (which is e
14af0 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 30 29  ither NULL or 0)
14b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
14b10 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 72 65  to the target re
14b20 67 69 73 74 65 72 2e 20 54 68 69 73 20 77 69 6c  gister. This wil
14b30 6c 20 62 65 20 74 68 65 20 72 65 73 75 6c 74 20  l be the result 
14b40 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  of the.         
14b50 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   ** expression..
14b60 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
14b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14b80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
14b90 6f 70 79 2c 20 72 4e 6f 74 46 6f 75 6e 64 2c 20  opy, rNotFound, 
14ba0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
14bb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14bc0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14bd0 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Here(v, j2);.   
14be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14bf0 6d 70 48 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20  mpHere(v, j5);. 
14c00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14c10 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
14c20 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
14c30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
14c40 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61  IN expr r%d", ta
14c50 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 62 72  rget));.      br
14c60 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
14c70 66 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  f.    /*.    ** 
14c80 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
14c90 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
14ca0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
14cb0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
14cc0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
14cd0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
14ce0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
14cf0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
14d00 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
14d10 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
14d20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
14d30 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
14d40 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
14d50 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
14d60 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
14d70 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
14d80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
14d90 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
14da0 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
14db0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
14dc0 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78  LItem = pExpr->x
14dd0 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  .pList->a;.     
14de0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
14df0 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a  pLItem->pExpr;..
14e00 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
14e10 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
14e20 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72  , pLeft, &r1, &r
14e30 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20  egFree1,.       
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
14e60 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
14e70 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
14e80 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14e90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ea0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
14eb0 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c  ;.      r3 = sql
14ec0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
14ed0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34  Parse);.      r4
14ee0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14ef0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14f00 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
14f10 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
14f20 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
14f50 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
14f60 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
14f70 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
14f80 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
14f90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14fa0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14fb0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
14fc0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
14fd0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14fe0 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
14ff0 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
15000 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
15010 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
15020 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
15030 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
15040 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20  Le, r1, r2, r4, 
15050 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
15060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15070 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
15080 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67  nd, r3, r4, targ
15090 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
150a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
150b0 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
150c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
150d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
150e0 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , r4);.      bre
150f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15100 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
15110 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
15120 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
15130 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
15140 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
15150 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15160 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
15170 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
15180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15190 64 4f 70 33 28 76 2c 20 4f 50 5f 54 72 69 67 67  dOp3(v, OP_Trigg
151a0 65 72 56 61 6c 2c 20 70 45 78 70 72 2d 3e 69 43  erVal, pExpr->iC
151b0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 2c 70 45  olumn, target,pE
151c0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
151d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
151e0 72 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  r->pTab );.     
151f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
15200 20 22 25 73 2e 25 73 22 2c 20 0a 20 20 20 20 20   "%s.%s", .     
15210 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
15220 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
15230 22 29 2c 20 0a 20 20 20 20 20 20 20 20 28 70 45  "), .        (pE
15240 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
15250 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
15260 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
15270 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
15280 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 20 20  me).      ));.  
15290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
152a0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
152b0 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
152c0 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
152d0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
152e0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
152f0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
15300 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
15310 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
15320 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
15330 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
15340 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
15350 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
15360 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
15370 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
15380 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
15390 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
153a0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
153b0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
153c0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
153d0 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
153e0 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
153f0 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
15400 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
15410 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
15420 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
15430 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
15440 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
15450 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
15460 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20  pExpr->pRight.  
15470 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
15480 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72  tional.  If ther
15490 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45  e is no.    ** E
154a0 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  LSE clause and n
154b0 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74  o other term mat
154c0 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ches, then the r
154d0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
154e0 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73   ** exprssion is
154f0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
15500 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
15510 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
15520 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
15530 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
15540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
15550 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
15560 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
15570 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
15580 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
15590 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
155a0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
155b0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
155c0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
155d0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
155e0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
155f0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
15600 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
15610 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
15620 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
15650 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
15660 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
15670 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
156a0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
156b0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
156c0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
156f0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
15700 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15730 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
15740 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
15770 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
15780 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
15790 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
157a0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
157b0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
157c0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
157d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
157e0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
157f0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
15800 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58       Expr cacheX
15810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15820 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64         /* Cached
15830 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f   expression X */
15840 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15870 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
15880 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
15890 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
158a0 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
158b0 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
158c0 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
158d0 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
158e0 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
158f0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
15900 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
15910 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15920 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15930 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
15940 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
15950 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15960 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ((pExpr->x.pList
15970 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
15980 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
15990 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
159a0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
159b0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
159c0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
159d0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
159e0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
159f0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
15a00 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
15a10 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
15a20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15a30 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
15a40 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
15a50 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
15a60 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
15a70 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
15a80 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
15a90 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
15aa0 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  e( pX->op==TK_RE
15ab0 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
15ac0 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20    cacheX.iTable 
15ad0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15ae0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
15af0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15b00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15b10 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
15b20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70         cacheX.op
15b30 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
15b40 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
15b50 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
15b60 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
15b70 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b  pLeft = &cacheX;
15b80 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d  .        pTest =
15b90 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20   &opCompare;.   
15ba0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
15bb0 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
15bc0 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
15bd0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
15be0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
15bf0 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
15c00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15c10 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
15c20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
15c30 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
15c40 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
15c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c60 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
15c70 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
15c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15c90 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
15ca0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15cb0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
15cc0 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
15cd0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
15ce0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15cf0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
15d00 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
15d10 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
15d20 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
15d30 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
15d40 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
15d50 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
15d60 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
15d70 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
15d80 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
15d90 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
15da0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15db0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
15dc0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
15dd0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
15de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15df0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
15e00 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  , 0, endLabel);.
15e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15e20 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
15e30 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  se, 1);.        
15e40 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15e50 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
15e60 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
15e70 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
15e80 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
15e90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15ea0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
15eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15ec0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
15ed0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
15ee0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
15ef0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15f00 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
15f10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15f40 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15f50 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
15f60 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
15f70 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
15f80 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20  nErr>0 .        
15f90 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43     || pParse->iC
15fa0 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68  acheLevel==iCach
15fb0 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  eLevel );.      
15fc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15fd0 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
15fe0 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
15ff0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
16000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
16010 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
16020 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
16030 69 6e 74 20 76 72 63 3b 0a 20 20 20 20 20 20 69  int vrc;.      i
16040 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
16050 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
16060 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16070 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16090 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
160a0 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
160b0 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
160c0 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
160d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
160e0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
160f0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
16100 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20  =OE_Rollback .  
16110 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
16120 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
16130 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20  Abort.          
16140 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
16150 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ity==OE_Fail.   
16160 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
16170 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
16180 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  gnore.      );. 
16190 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
161a0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
161b0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
161c0 29 20 29 3b 0a 20 20 20 20 20 20 76 72 63 20 3d  ) );.      vrc =
161d0 20 28 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74   (pExpr->affinit
161e0 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 3f 20 53  y==OE_Ignore ? S
161f0 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
16200 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3b 0a 20  E_CONSTRAINT);. 
16210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16220 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
16230 74 2c 20 76 72 63 2c 20 70 45 78 70 72 2d 3e 61  t, vrc, pExpr->a
16240 66 66 69 6e 69 74 79 2c 20 30 2c 20 70 45 78 70  ffinity, 0, pExp
16250 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
16260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16270 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
16280 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16290 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
162a0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
162b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
162c0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
162d0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
162e0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
162f0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
16300 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
16310 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
16320 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
16330 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
16340 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
16350 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
16360 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
16370 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
16380 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
16390 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
163a0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
163b0 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
163c0 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
163d0 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
163e0 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
163f0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
16400 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
16410 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
16420 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
16430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
16440 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
16450 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
16460 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
16470 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
16480 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16490 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32  Parse);.  int r2
164a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
164b0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
164c0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69   pExpr, r1);.  i
164d0 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
164e0 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d   *pReg = r1;.  }
164f0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
16500 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16510 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16520 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a   *pReg = 0;.  }.
16530 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
16540 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16550 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
16560 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
16570 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
16580 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
16590 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
165a0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
165b0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
165c0 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
165d0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
165e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
165f0 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
16600 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
16610 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
16620 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
16630 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
16640 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
16650 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
16660 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
16670 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
16680 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
16690 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
166a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c  pParse->pVdbe ||
166b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
166c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
166d0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
166e0 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
166f0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
16700 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
16710 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
16720 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
16730 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
16740 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   target;.}../*.*
16750 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16760 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
16770 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
16780 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
16790 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
167a0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
167b0 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
167c0 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
167d0 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
167e0 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
167f0 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
16800 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
16810 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
16820 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
16830 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
16840 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
16850 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
16860 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
16870 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16880 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
16890 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
168a0 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
168b0 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
168c0 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
168d0 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
168e0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
168f0 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
16900 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eused..*/.int sq
16910 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
16920 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
16930 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
16940 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
16950 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
16960 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
16970 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d  inReg;.  inReg =
16980 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16990 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
169a0 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
169b0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
169c0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
169d0 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
169e0 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f  erms to INSERT o
169f0 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74  r UPDATE.  And t
16a00 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  he only.  ** oth
16a10 65 72 20 70 6c 61 63 65 20 77 68 65 72 65 20 65  er place where e
16a20 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
16a30 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
16a40 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a   TK_REGISTER is.
16a50 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c    ** in WHERE cl
16a60 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
16a70 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c    So as currentl
16a80 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74  y implemented, t
16a90 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20  here is.  ** no 
16aa0 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47  way for a TK_REG
16ab0 49 53 54 45 52 20 74 6f 20 65 78 69 73 74 20 68  ISTER to exist h
16ac0 65 72 65 2e 20 20 42 75 74 20 69 74 20 73 65 65  ere.  But it see
16ad0 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20  ms prudent to.  
16ae0 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41  ** keep the ALWA
16af0 59 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65  YS() in case the
16b00 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
16b10 65 20 63 68 61 6e 67 65 20 77 69 74 68 20 66 75  e change with fu
16b20 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ture.  ** modifi
16b30 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e  cations or enhan
16b40 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66  cements. */.  if
16b50 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
16b60 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29  op!=TK_REGISTER)
16b70 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d   ){  .    int iM
16b80 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b  em;.    iMem = +
16b90 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16bb0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
16bc0 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20   inReg, iMem);. 
16bd0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
16be0 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78   = iMem;.    pEx
16bf0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  pr->op = TK_REGI
16c00 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  STER;.  }.  retu
16c10 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
16c20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
16c30 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f  f pExpr is an co
16c40 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
16c50 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  n that is approp
16c60 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63  riate.** for fac
16c70 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20  toring out of a 
16c80 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61  loop.  Appropria
16c90 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  te expressions a
16ca0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  re:.**.**    *  
16cb0 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
16cc0 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f  hat evaluates to
16cd0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63   two or more opc
16ce0 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  odes..**.**    *
16cf0 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72    Any OP_Integer
16d00 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74  , OP_Real, OP_St
16d10 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f  ring, OP_Blob, O
16d20 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20  P_Null, .**     
16d30 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65    or OP_Variable
16d40 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
16d50 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64  eed to be placed
16d60 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20   in a .**       
16d70 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74 65  specific registe
16d80 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
16d90 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61  s no point in fa
16da0 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67  ctoring out sing
16db0 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  le-instruction c
16dc0 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65  onstant.** expre
16dd0 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64  ssions that need
16de0 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e   to be placed in
16df0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
16e00 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20  gister.  .** We 
16e10 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65  could factor the
16e20 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20  m out, but then 
16e30 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20  we would end up 
16e40 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f  adding an.** OP_
16e50 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f  SCopy instructio
16e60 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61  n to move the va
16e70 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  lue into the cor
16e80 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  rect register.**
16e90 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68   later.  We migh
16ea0 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75  t as well just u
16eb0 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
16ec0 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a  instruction and.
16ed0 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f  ** avoid the OP_
16ee0 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  SCopy..*/.static
16ef0 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61   int isAppropria
16f00 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45  teForFactoring(E
16f10 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21  xpr *p){.  if( !
16f20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
16f30 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20  stantNotJoin(p) 
16f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
16f50 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61    /* Only consta
16f60 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  nt expressions a
16f70 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
16f80 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a  or factoring */.
16f90 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c    }.  if( (p->fl
16fa0 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44 65  ags & EP_FixedDe
16fb0 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  st)==0 ){.    re
16fc0 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20  turn 1;  /* Any 
16fd0 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74  constant without
16fe0 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
16ff0 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69  tion is appropri
17000 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69  ate */.  }.  whi
17010 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
17020 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65  LUS ) p = p->pLe
17030 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  ft;.  switch( p-
17040 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  >op ){.#ifndef S
17050 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
17060 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
17070 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66   TK_BLOB:.#endif
17080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
17090 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  IABLE:.    case 
170a0 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
170b0 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
170c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
170d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
170e0 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ING: {.      tes
170f0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17100 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74  _BLOB );.      t
17110 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17120 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20  TK_VARIABLE );. 
17130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17140 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
17150 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17160 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  se( p->op==TK_FL
17170 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  OAT );.      tes
17180 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17190 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  _NULL );.      t
171a0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
171b0 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20  TK_STRING );.   
171c0 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73     /* Single-ins
171d0 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e  truction constan
171e0 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64 20  ts with a fixed 
171f0 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a  destination are.
17200 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
17210 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49  done in-line.  I
17220 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d  f we factor them
17230 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74  , they will just
17240 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70   end.      ** up
17250 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f   generating an O
17260 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20  P_SCopy to move 
17270 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65  the value to the
17280 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20   destination.   
17290 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20     ** register. 
172a0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
172b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  0;.    }.    cas
172c0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
172d0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
172e0 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
172f0 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  || p->pLeft->op=
17300 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
17310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
17320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17330 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17340 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
17350 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17360 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
17370 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
17380 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
17390 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
173a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
173b0 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75  .** factoring ou
173c0 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65  t of a loop, the
173d0 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65  n evaluate the e
173e0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74  xpression.** int
173f0 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
17400 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
17410 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54  ression into a T
17420 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78  K_REGISTER.** ex
17430 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
17440 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73  tic int evalCons
17450 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57  tExpr(Walker *pW
17460 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
17470 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
17480 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
17490 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68  pParse;.  switch
174a0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
174b0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
174c0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TER: {.      ret
174d0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
174e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
174f0 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
17500 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
17510 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
17520 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20  _CONST_FUNC: {. 
17530 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75       /* The argu
17540 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74  ments to a funct
17550 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65 64  ion have a fixed
17560 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
17570 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d      ** Mark them
17580 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f   this way to avo
17590 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e  id generated unn
175a0 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20  eeded OP_SCopy. 
175b0 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
175c0 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ions. .      */.
175d0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
175e0 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
175f0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73  .pList;.      as
17600 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
17610 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17620 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
17630 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29       if( pList )
17640 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
17650 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
17660 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
17670 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
17680 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a  tem = pList->a;.
17690 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e          for(; i>
176a0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
176b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
176c0 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70 45  ALWAYS(pItem->pE
176d0 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70 45  xpr) ) pItem->pE
176e0 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
176f0 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20  _FixedDest;.    
17700 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17720 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70  .  }.  if( isApp
17730 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
17740 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20  ring(pExpr) ){. 
17750 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50     int r1 = ++pP
17760 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
17770 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d  int r2;.    r2 =
17780 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17790 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
177a0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
177b0 66 28 20 4e 45 56 45 52 28 72 31 21 3d 72 32 29  f( NEVER(r1!=r2)
177c0 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
177d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
177e0 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d   r1);.    pExpr-
177f0 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
17800 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
17810 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
17820 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
17830 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
17840 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
17850 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
17860 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
17870 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
17880 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
17890 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
178a0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
178b0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
178c0 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
178d0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
178e0 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
178f0 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
17900 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
17910 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
17920 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
17930 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f  ed values..*/.vo
17940 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
17950 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
17960 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17970 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
17980 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
17990 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e  llback = evalCon
179a0 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c  stExpr;.  w.xSel
179b0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
179c0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
179d0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
179e0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
179f0 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  r);.}.../*.** Ge
17a00 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
17a10 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
17a20 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
17a30 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
17a40 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
17a50 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
17a60 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
17a70 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
17a80 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
17a90 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17aa0 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
17ab0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17ac0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
17ad0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17ae0 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
17af0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17b00 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17b10 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
17b20 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
17b30 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
17b40 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
17b50 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
17b60 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
17b70 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20  t doHardCopy    
17b80 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20   /* Make a hard 
17b90 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c  copy of every el
17ba0 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  ement */.){.  st
17bb0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17bc0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
17bd0 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   i, n;.  assert(
17be0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
17bf0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
17c00 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  );.  n = pList->
17c10 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
17c20 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
17c30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
17c40 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
17c50 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20  tem->iAlias ){. 
17c60 20 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20       int iReg = 
17c70 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65  codeAlias(pParse
17c80 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c  , pItem->iAlias,
17c90 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
17ca0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
17cb0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
17cc0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
17cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 65 67  ;.      if( iReg
17ce0 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
17cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17d00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17d10 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65  opy, iReg, targe
17d20 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+i);.      }.  
17d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
17d40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17d50 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
17d60 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
17d70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
17d80 48 61 72 64 43 6f 70 79 20 26 26 20 21 70 50 61  HardCopy && !pPa
17d90 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
17da0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
17db0 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
17dc0 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  py(pParse, targe
17dd0 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, n);.    }.  }
17de0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
17df0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17e00 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
17e10 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
17e20 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
17e30 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
17e40 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
17e50 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
17e60 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
17e70 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
17e80 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
17e90 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
17ea0 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
17eb0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
17ec0 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
17ed0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
17ee0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
17ef0 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
17f00 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
17f10 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
17f20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
17f30 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
17f40 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
17f50 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
17f60 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
17f70 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
17f80 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
17f90 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
17fa0 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
17fb0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
17fc0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
17fd0 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
17fe0 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
17ff0 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
18000 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
18010 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
18020 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
18030 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
18040 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
18050 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
18060 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
18070 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
18080 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
18090 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
180a0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
180b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
180c0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
180d0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
180e0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
180f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18100 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
18110 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
18120 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
18130 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
18140 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
18150 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
18160 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
18170 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
18180 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
18190 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
181a0 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20  ;  /* Existance 
181b0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
181c0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
181d0 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
181e0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
181f0 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
18200 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
18210 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
18220 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
18230 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
18240 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
18250 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18260 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
18270 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
18280 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
18290 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
182a0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
182b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
182c0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
182d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
182e0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
182f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
18300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
18310 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
18320 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
18330 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
18340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18350 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18360 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
18370 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
18380 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
18390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
183a0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
183b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
183c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
183d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
183e0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
183f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18400 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18420 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
18430 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
18440 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
18450 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
18460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18470 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
18480 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
18490 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
184a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
184b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
184c0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
184d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
184e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
184f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
18500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
18510 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
18520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
18530 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
18540 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
18550 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
18560 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
18570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
18580 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
18590 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
185a0 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
185b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
185c0 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
185d0 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
185e0 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
185f0 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
18600 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
18610 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
18620 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18630 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
18640 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18650 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
18660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18670 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
18680 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18690 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
186a0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
186b0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
186c0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
186d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
186e0 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
186f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18700 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
18710 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
18740 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
18750 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
18760 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
18770 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18780 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
18790 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
187a0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
187b0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
187c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
187d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
187e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
187f0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
18800 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18810 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
18820 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
18830 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
18840 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
18850 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
18860 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18870 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
18880 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
18890 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
188a0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
188b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
188c0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
188d0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
188e0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
188f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18900 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
18910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18920 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
18930 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
18940 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
18950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
18960 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18970 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
18980 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42  .      /*    x B
18990 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
189a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
189b0 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   Is equivalent t
189c0 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o .      **.    
189d0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
189e0 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20   x<=z.      **. 
189f0 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20       ** Code it 
18a00 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
18a10 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
18a20 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
18a30 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ion.      ** ele
18a40 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  mentation of x..
18a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
18a60 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20  xpr exprAnd;.   
18a70 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74     Expr compLeft
18a80 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
18a90 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78  pRight;.      Ex
18aa0 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20  pr exprX;..     
18ab0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
18ac0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18ad0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
18ae0 3b 0a 20 20 20 20 20 20 65 78 70 72 58 20 3d 20  ;.      exprX = 
18af0 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
18b00 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20       exprAnd.op 
18b10 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
18b20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
18b30 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20  &compLeft;.     
18b40 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
18b50 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
18b60 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20      compLeft.op 
18b70 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63  = TK_GE;.      c
18b80 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
18b90 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
18ba0 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
18bb0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
18bc0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
18bd0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
18be0 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f   TK_LE;.      co
18bf0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
18c00 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
18c10 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
18c20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
18c30 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
18c40 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20     exprX.iTable 
18c50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18c60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
18c70 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
18c80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18c90 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
18ca0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20  .      exprX.op 
18cb0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
18cc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
18cd0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
18ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18cf0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
18d00 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
18d10 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
18d20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18d30 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
18d40 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
18d50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
18d60 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
18d70 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
18d80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18d90 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
18da0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
18db0 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      testc
18dc0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
18dd0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18de0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
18df0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
18e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
18e10 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18e20 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
18e30 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
18e40 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18e50 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
18e60 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
18e70 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18e80 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
18e90 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
18ea0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
18eb0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
18ec0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
18ed0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
18ee0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
18ef0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
18f00 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
18f10 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
18f20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
18f30 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
18f40 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
18f50 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
18f60 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
18f70 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
18f80 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
18f90 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
18fa0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
18fb0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
18fc0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
18fd0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
18fe0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
18ff0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
19000 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
19010 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19020 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19030 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
19040 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
19050 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
19060 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
19070 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
19080 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
19090 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
190a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
190b0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
190c0 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61  eturn; /* Exista
190d0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
190e0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
190f0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
19100 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
19110 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
19120 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
19130 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
19140 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
19150 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
19160 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
19170 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
19180 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
19190 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
191a0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
191b0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
191c0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
191d0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
191e0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
191f0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
19200 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
19210 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
19230 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
19240 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
19250 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
19260 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
19270 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
19280 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
19290 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
192a0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
192c0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
192d0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
192e0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
192f0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
19300 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
19310 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
19320 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
19330 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
19340 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
19350 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
19360 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
19370 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
19380 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
19390 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
193a0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
193b0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
193c0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
193d0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
193e0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
193f0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
19400 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
19410 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
19420 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
19430 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
19440 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
19450 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
19460 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
19470 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
19480 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
19490 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
194a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
194b0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
194c0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
194d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
194e0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
194f0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
19500 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
19510 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
19520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
19530 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
19540 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
19550 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
19560 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
19570 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
19580 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
19590 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
195a0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
195b0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
195c0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
195d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
195e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
195f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19600 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
19610 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
19620 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
19630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19640 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19650 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
19660 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19670 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
19680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19690 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
196a0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
196b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
196c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
196d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
196e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
196f0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
19700 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
19710 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
19720 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19730 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
19740 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
19750 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
19760 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19770 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
19780 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
19790 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
197a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
197b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
197c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
197d0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
197e0 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
197f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19800 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
19810 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19820 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
19830 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
19840 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
19850 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19860 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
19870 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
19880 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
19890 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
198a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
198b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
198c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
198d0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
198e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
198f0 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
19900 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19910 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
19920 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19930 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
19940 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
19950 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19960 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
19970 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19980 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
19990 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
199a0 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
199b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
199c0 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
199d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
19a00 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
19a10 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
19a20 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
19a30 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
19a40 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a60 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
19a70 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19a80 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19a90 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
19aa0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
19ab0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
19ac0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19ad0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
19ae0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
19af0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65  NULL: {.      te
19b00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
19b10 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
19b20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
19b30 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
19b40 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
19b50 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19b60 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
19b70 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
19b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b90 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
19ba0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
19bb0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19bc0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
19bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19be0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
19bf0 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
19c00 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
19c10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
19c20 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
19c30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19c40 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
19c50 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
19c60 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
19c70 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
19c80 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
19c90 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
19ca0 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
19cb0 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
19cc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
19cd0 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
19ce0 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
19cf0 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
19d00 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
19d10 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61   exprX;..      a
19d20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
19d30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19d40 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
19d50 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
19d60 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
19d70 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
19d80 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
19d90 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
19da0 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
19db0 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
19dc0 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
19dd0 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
19de0 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
19df0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
19e00 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
19e10 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
19e20 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
19e30 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
19e40 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
19e50 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_LE;.      comp
19e60 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
19e70 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
19e80 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
19e90 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
19ea0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
19eb0 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
19ec0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19ed0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
19ee0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
19ef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19f00 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
19f10 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20       exprX.op = 
19f20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
19f30 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
19f40 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
19f50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
19f60 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
19f70 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
19f80 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
19f90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19fa0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
19fb0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
19fc0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19fd0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
19fe0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
19ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a000 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1a010 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1a020 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1a030 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1a040 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a050 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1a060 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1a070 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1a080 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a090 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a0a0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1a0b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1a0c0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1a0d0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
1a0e0 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
1a0f0 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
1a100 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
1a110 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
1a120 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
1a130 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
1a140 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
1a150 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
1a160 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f  ny way..**.** So
1a170 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
1a180 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1a190 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74   FALSE even if t
1a1a0 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
1a1b0 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
1a1c0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
1a1d0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
1a1e0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
1a1f0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
1a200 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
1a210 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20  n FALSE just to 
1a220 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
1a230 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1a240 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74  returns false, t
1a250 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
1a260 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
1a270 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
1a280 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
1a290 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
1a2a0 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
1a2b0 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68   TRUE return, th
1a2c0 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
1a2d0 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
1a2e0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1a2f0 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
1a300 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
1a310 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1a320 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
1a330 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
1a340 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a  ra FALSE - that.
1a350 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
1a360 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
1a370 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
1a380 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
1a390 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
1a3a0 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61  t TRUE could lea
1a3b0 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
1a3c0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1a3d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
1a3e0 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
1a3f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1a400 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29  ( pA==0||pB==0 )
1a410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
1a420 3d 70 41 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  =pA;.  }.  asser
1a430 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1a440 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f  operty(pA, EP_To
1a450 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1a460 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ed) );.  assert(
1a470 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1a480 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65  erty(pB, EP_Toke
1a490 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1a4a0 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ) );.  if( ExprH
1a4b0 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  asProperty(pA, E
1a4c0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20  P_xIsSelect) || 
1a4d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a4e0 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pB, EP_xIsSelect
1a4f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a500 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41  0;.  }.  if( (pA
1a510 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1a520 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
1a530 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
1a540 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1a550 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
1a560 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
1a570 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1a580 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
1a590 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
1a5a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1a5b0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
1a5c0 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1a5d0 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1a5e0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20  eturn 0;..  if( 
1a5f0 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pA->x.pList && p
1a600 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  B->x.pList ){.  
1a610 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73    if( pA->x.pLis
1a620 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78 2e  t->nExpr!=pB->x.
1a630 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
1a640 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
1a650 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70 4c  (i=0; i<pA->x.pL
1a660 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1a670 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1a680 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c 69  xprA = pA->x.pLi
1a690 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1a6a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1a6b0 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73 74  rB = pB->x.pList
1a6c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1a6d0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1a6e0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
1a6f0 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
1a700 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1a710 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e  }else if( pA->x.
1a720 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70  pList || pB->x.p
1a730 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
1a740 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1a750 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
1a760 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
1a770 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
1a780 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
1a790 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1a7a0 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74  perty(pA, EP_Int
1a7b0 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66  Value) ){.    if
1a7c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1a7d0 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pB, EP_IntVal
1a7e0 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61  ue) || pA->u.iVa
1a7f0 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue!=pB->u.iValu
1a800 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1a810 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 0;.    }.  }el
1a820 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  se if( pA->op!=T
1a830 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
1a840 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
1a850 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1a860 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1a870 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70 42  lue) || NEVER(pB
1a880 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29  ->u.zToken==0) )
1a890 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
1a8a0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1a8b0 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
1a8c0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
1a8d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a8e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1a8f0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 1;.}.../*.
1a900 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
1a910 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
1a920 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
1a930 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
1a940 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1a950 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
1a960 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1a970 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
1a980 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1a990 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
1a9a0 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
1a9b0 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
1a9c0 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
1a9d0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
1a9e0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1a9f0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
1aa00 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
1aa10 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
1aa20 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
1aa30 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20  ,.       3,.    
1aa40 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
1aa50 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  mn,.       &pInf
1aa60 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c  o->nColumnAlloc,
1aa70 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
1aa80 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
1aa90 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
1aaa0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1aab0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
1aac0 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
1aad0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1aae0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
1aaf0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
1ab00 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
1ab10 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
1ab20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
1ab30 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
1ab40 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
1ab50 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
1ab60 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
1ab70 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
1ab80 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1ab90 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
1aba0 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
1abb0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
1abc0 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
1abd0 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
1abe0 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
1abf0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41    &pInfo->nFuncA
1ac00 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
1ac10 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
1ac20 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
1ac30 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
1ac40 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
1ac50 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
1ac60 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
1ac70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
1ac80 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1ac90 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
1aca0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1acb0 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
1acc0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1acd0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
1ace0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
1acf0 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
1ad00 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
1ad10 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
1ad20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
1ad30 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
1ad40 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
1ad50 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
1ad60 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
1ad70 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
1ad80 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
1ad90 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
1ada0 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
1adb0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
1adc0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1add0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
1ade0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1adf0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ae00 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1ae10 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
1ae20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ae30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1ae40 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
1ae50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1ae60 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
1ae70 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
1ae80 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
1ae90 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
1aea0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1aeb0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
1aec0 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
1aed0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
1aee0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1aef0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
1af00 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
1af10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1af20 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
1af30 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1af40 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1af50 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1af60 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1af70 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
1af80 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1af90 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1afa0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
1afb0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1afc0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
1afd0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
1afe0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
1aff0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1b000 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
1b010 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
1b020 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1b030 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
1b040 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b050 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1b060 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
1b070 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1b080 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
1b090 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
1b0a0 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
1b0b0 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
1b0c0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
1b0d0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
1b0e0 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
1b0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1b100 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1b110 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
1b120 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Col = pAggInfo->
1b130 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  aCol;.          
1b140 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67    for(k=0; k<pAg
1b150 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
1b160 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  k++, pCol++){.  
1b170 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b180 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  pCol->iTable==pE
1b190 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pCol->iColumn==
1b1c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
1b1d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b1e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b1f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b210 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49     if( (k>=pAggI
1b220 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20  nfo->nColumn).  
1b230 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b             && (k
1b240 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c   = addAggInfoCol
1b250 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  umn(pParse->db, 
1b260 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20  pAggInfo))>=0 . 
1b270 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
1b280 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1b290 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
1b2a0 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[k];.         
1b2b0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20       pCol->pTab 
1b2c0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1b2e0 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
1b2f0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1b300 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1b310 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
1b320 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
1b330 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
1b340 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1b350 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
1b360 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1b370 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1b380 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1b390 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b3b0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
1b3c0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
1b3d0 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
1b3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b3f0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
1b400 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
1b410 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
1b420 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1b430 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
1b440 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
1b450 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
1b460 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
1b470 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1b480 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
1b490 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1b4a0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
1b4b0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
1b4c0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1b4d0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
1b4e0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1b4f0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
1b500 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
1b530 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1b560 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b5d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1b5e0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
1b5f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1b600 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
1b610 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
1b620 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
1b630 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b650 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
1b660 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
1b670 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
1b680 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
1b690 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
1b6a0 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
1b6b0 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
1b6c0 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
1b6d0 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
1b6e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
1b6f0 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
1b700 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
1b710 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
1b720 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
1b730 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
1b740 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
1b750 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1b760 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1b770 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
1b780 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1b790 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1b7a0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
1b7b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1b7c0 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
1b7d0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
1b7e0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
1b7f0 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
1b800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b810 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
1b820 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
1b830 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
1b840 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
1b850 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
1b860 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
1b870 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1b880 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
1b890 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1b8a0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TION: {.      /*
1b8b0 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68   The pNC->nDepth
1b8c0 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20  ==0 test causes 
1b8d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1b8e0 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  ons in subquerie
1b8f0 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  s.      ** to be
1b900 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20   ignored */.    
1b910 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
1b920 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
1b930 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1b940 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
1b950 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
1b960 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
1b970 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
1b980 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
1b990 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
1b9a0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
1b9b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
1b9c0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1b9d0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
1b9e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
1b9f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ba00 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1ba10 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1ba20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1ba30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ba40 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
1ba50 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1ba60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ba70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ba80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
1ba90 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
1baa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1bab0 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
1bac0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
1bad0 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
1bae0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
1baf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1bb00 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
1bb10 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
1bb20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
1bb30 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
1bb40 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
1bb50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1bb60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1bb70 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1bb80 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1bb90 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1bba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1bbb0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
1bbc0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
1bbd0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
1bbe0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
1bbf0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1bc00 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
1bc10 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1bc20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1bc30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bc40 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1bc50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1bc60 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
1bc70 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1bc80 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1bcb0 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n, sqlite3Strlen
1bcc0 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
1bcd0 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
1bce0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
1bcf0 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
1bd00 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
1bd10 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
1bd20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1bd30 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
1bd40 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1bd50 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1bd60 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
1bd70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1bd80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1bda0 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1bdb0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
1bdc0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1bdd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bde0 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
1bdf0 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
1be00 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
1be10 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
1be20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1be30 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1be40 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
1be50 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1be60 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1be70 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
1be80 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70  Irreducible(pExp
1be90 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  r);.        pExp
1bea0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
1beb0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1bec0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
1bed0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
1bee0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1bef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bf00 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1bf10 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
1bf20 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
1bf30 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
1bf40 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1bf50 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1bf60 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
1bf70 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
1bf80 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e  >u.pNC;.  if( pN
1bf90 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
1bfa0 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
1bfb0 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  +;.    sqlite3Wa
1bfc0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1bfd0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
1bfe0 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
1bff0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1c000 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  une;.  }else{.  
1c010 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1c020 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tinue;.  }.}../*
1c030 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
1c040 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
1c050 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
1c060 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1c070 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
1c080 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
1c090 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
1c0a0 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
1c0b0 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
1c0c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
1c0d0 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
1c0e0 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
1c0f0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
1c100 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c110 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
1c120 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
1c130 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1c140 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
1c150 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
1c160 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
1c170 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c180 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1c190 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
1c1a0 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
1c1b0 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
1c1c0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1c1d0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
1c1e0 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
1c1f0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
1c200 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
1c210 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
1c220 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
1c230 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
1c240 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
1c250 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
1c260 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
1c270 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
1c280 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
1c290 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
1c2a0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
1c2b0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1c2c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c2d0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
1c2e0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c2f0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
1c300 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
1c310 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
1c320 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1c330 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
1c340 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
1c350 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
1c360 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c370 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1c380 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
1c390 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
1c3a0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1c3b0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1c3c0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1c3d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1c3e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1c3f0 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
1c400 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
1c410 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1c420 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
1c430 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
1c440 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
1c450 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
1c460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1c470 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
1c480 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
1c490 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1c4a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c4b0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
1c4c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1c4d0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1c4e0 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
1c4f0 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
1c500 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
1c510 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
1c520 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
1c530 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
1c540 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
1c550 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
1c560 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
1c570 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
1c580 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
1c590 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
1c5a0 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
1c5b0 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
1c5c0 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
1c5d0 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
1c5e0 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
1c5f0 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
1c600 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c610 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1c620 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1c630 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
1c640 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1c650 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1c660 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
1c670 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
1c680 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1c690 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
1c6a0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1c6b0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1c6c0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1c6d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
1c6e0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1c6f0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1c700 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1c710 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1c720 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
1c730 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1c740 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
1c750 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1c760 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
1c770 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
1c780 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
1c790 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
1c7a0 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
1c7b0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
1c7c0 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
1c7d0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
1c7e0 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
1c7f0 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
1c800 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
1c810 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26    if( nReg<=n &&
1c820 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
1c830 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
1c840 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61  +n-1) ){.    pPa
1c850 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
1c860 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1c870 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
1c880 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
1c890 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
1c8a0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1c8b0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1c8c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1c8d0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1c8e0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1c8f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c900 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1c910 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg){.  if( nReg>
1c920 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1c930 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
1c940 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
1c950 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
1c960 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
1c970 0a 20 20 7d 0a 7d 0a                             .  }.}.