/ Hex Artifact Content
Login

Artifact d0a345e1d8995e142bc5d9f39a97b9981d7d8f23:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0760: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0770: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0780: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0790: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
07a0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
07b0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
07c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
07d0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
07e0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
07f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0800: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0810: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0820: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0830: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0840: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0850: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0860: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0870: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
0880: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0890: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 50 61  e3ExprSetColl(Pa
08a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
08b0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
08c0: 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20 20 63  *pCollName){.  c
08d0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 20  har *zColl = 0; 
08e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
08f0: 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63  quoted name of c
0900: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0910: 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
0920: 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 33  pColl;.  sqlite3
0930: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0940: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
0950: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
0960: 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d 65 29  n(db, pCollName)
0970: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
0980: 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43   zColl ){.    pC
0990: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
09a0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
09b0: 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  e, zColl);.    i
09c0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
09d0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
09e0: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45   pColl;.      pE
09f0: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
0a00: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
0a10: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
0a20: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
0a30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  );.  return pExp
0a40: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0a50: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
0a60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0a70: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0a80: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0a90: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0aa0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
0ab0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
0ac0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
0ad0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
0ae0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0af0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
0b00: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0b10: 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45  ;.  Expr *p = pE
0b20: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  xpr;.  while( AL
0b30: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 69  WAYS(p) ){.    i
0b40: 6e 74 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c  nt op;.    pColl
0b50: 20 3d 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20   = p->pColl;.   
0b60: 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65   if( pColl ) bre
0b70: 61 6b 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e  ak;.    op = p->
0b80: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  op;.    if( p->p
0b90: 54 61 62 21 3d 30 20 26 26 20 28 0a 20 20 20 20  Tab!=0 && (.    
0ba0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43      op==TK_AGG_C
0bb0: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0bc0: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0bd0: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
0be0: 3d 54 4b 5f 54 52 49 47 47 45 52 0a 20 20 20 20  =TK_TRIGGER.    
0bf0: 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d  )){.      /* op=
0c00: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
0c10: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
0c20: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0c30: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0c40: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0c50: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0c60: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0c70: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0c80: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
0c90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0ca0: 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  ll;.      int j 
0cb0: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
0cc0: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
0cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
0ce0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0cf0: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ;.        zColl 
0d00: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
0d10: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
0d20: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
0d30: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
0d40: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
0d50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78   0);.        pEx
0d60: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pr->pColl = pCol
0d70: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
0d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0d90: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53    if( op!=TK_CAS
0da0: 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55  T && op!=TK_UPLU
0db0: 53 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  S ){.      break
0dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
0dd0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  p->pLeft;.  }.  
0de0: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
0df0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0e00: 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70  pColl) ){ .    p
0e10: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
0e20: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
0e30: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
0e40: 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  an operand of a 
0e50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0e60: 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68  tor.  aff2 is th
0e70: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
0e80: 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ty of the other 
0e90: 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
0ea0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
0eb0: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0ec0: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
0ed0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
0ee0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0ef0: 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  tor..*/.char sql
0f00: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0f10: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ity(Expr *pExpr,
0f20: 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63   char aff2){.  c
0f30: 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74  har aff1 = sqlit
0f40: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0f50: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66  Expr);.  if( aff
0f60: 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20  1 && aff2 ){.   
0f70: 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f   /* Both sides o
0f80: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0f90: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66   are columns. If
0fa0: 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63   one has numeric
0fb0: 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79  .    ** affinity
0fc0: 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65  , use that. Othe
0fd0: 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66  rwise use no aff
0fe0: 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  inity..    */.  
0ff0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e    if( sqlite3IsN
1000: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61  umericAffinity(a
1010: 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49  ff1) || sqlite3I
1020: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1030: 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20  (aff2) ){.      
1040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
1050: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
1060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1070: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1080: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  NE;.    }.  }els
1090: 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21  e if( !aff1 && !
10a0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  aff2 ){.    /* N
10b0: 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
10c0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
10d0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70   a column.  Comp
10e0: 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  are the.    ** r
10f0: 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e  esults directly.
1100: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
1110: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
1120: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1130: 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20   /* One side is 
1140: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74  a column, the ot
1150: 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20  her is not. Use 
1160: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  the columns affi
1170: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  nity. */.    ass
1180: 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20  ert( aff1==0 || 
1190: 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72  aff2==0 );.    r
11a0: 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66  eturn (aff1 + af
11b0: 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  f2);.  }.}../*.*
11c0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
11d0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
11e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  .  Return the ty
11f0: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1200: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70   should.** be ap
1210: 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70  plied to both op
1220: 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20  erands prior to 
1230: 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  doing the compar
1240: 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ison..*/.static 
1250: 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41  char comparisonA
1260: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
1270: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
1280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1290: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
12a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
12b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
12c0: 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20  K_LT ||.        
12d0: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
12e0: 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GT || pExpr->op=
12f0: 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_GE || pExpr-
1300: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20  >op==TK_LE ||.  
1310: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1320: 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70  p==TK_NE || pExp
1330: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
1340: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1350: 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NOT );.  assert(
1360: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
1370: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1380: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1390: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
13a0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
13b0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
13c0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13d0: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
13e0: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  t, aff);.  }else
13f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1400: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1410: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1420: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
1430: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1440: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
1450: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1460: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73  pr, aff);.  }els
1470: 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20  e if( !aff ){.  
1480: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
1490: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72  FF_NONE;.  }.  r
14a0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
14b0: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
14c0: 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73  omparison expres
14d0: 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27  sion, eg. '=', '
14e0: 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e  <', IN(...) etc.
14f0: 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79  .** idx_affinity
1500: 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   is the affinity
1510: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
1520: 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72  olumn. Return tr
1530: 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64  ue.** if the ind
1540: 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79  ex with affinity
1550: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61   idx_affinity ma
1560: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  y be used to imp
1570: 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f  lement.** the co
1580: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70  mparison in pExp
1590: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
15a0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
15b0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
15c0: 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ar idx_affinity)
15d0: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63  {.  char aff = c
15e0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
15f0: 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74  y(pExpr);.  swit
1600: 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63  ch( aff ){.    c
1610: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1620: 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ONE:.      retur
1630: 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51  n 1;.    case SQ
1640: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
1650: 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f       return idx_
1660: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1670: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64  _AFF_TEXT;.    d
1680: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1690: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75  turn sqlite3IsNu
16a0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
16b0: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d  x_affinity);.  }
16c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16d0: 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68   the P5 value th
16e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
16f0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
1700: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
1710: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1720: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1730: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1740: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74  nd pExpr2..*/.st
1750: 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f  atic u8 binaryCo
1760: 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45  mpareP5(Expr *pE
1770: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
1780: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
1790: 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20  ll){.  u8 aff = 
17a0: 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70  (char)sqlite3Exp
17b0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
17c0: 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73  );.  aff = (u8)s
17d0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
17e0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
17f0: 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e  f) | (u8)jumpIfN
1800: 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66  ull;.  return af
1810: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  f;.}../*.** Retu
1820: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1830: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1840: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1850: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1860: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1870: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1880: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1890: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
18a0: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
18b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
18c0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18d0: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
18e0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
18f0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
1900: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1910: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
1920: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
1930: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1940: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1950: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1960: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1970: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1980: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
1990: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
19a0: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
19b0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
19c0: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
19d0: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
19e0: 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  red..*/.CollSeq 
19f0: 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f  *sqlite3BinaryCo
1a00: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
1a10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
1a20: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a    Expr *pLeft, .
1a30: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
1a40: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1a50: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ll;.  assert( pL
1a60: 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  eft );.  if( pLe
1a70: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
1a80: 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
1a90: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
1aa0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f  pColl );.    pCo
1ab0: 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ll = pLeft->pCol
1ac0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
1ad0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
1ae0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1af0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b00: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43  sert( pRight->pC
1b10: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1b20: 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c   = pRight->pColl
1b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1b50: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1b60: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
1b70: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1b80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1b90: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1ba0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
1bb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bc0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1bd0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1be0: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1bf0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
1c00: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70  tic int codeComp
1c10: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
1c20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  arse,    /* The 
1c30: 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64  parsing (and cod
1c40: 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f  e generating) co
1c50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1c60: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20  *pLeft,      /* 
1c70: 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  The left operand
1c80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
1c90: 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  ht,     /* The r
1ca0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
1cb0: 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20    int opcode,   
1cc0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
1cd0: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  rison opcode */.
1ce0: 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69    int in1, int i
1cf0: 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20  n2, /* Register 
1d00: 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73  holding operands
1d10: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
1d20: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1d30: 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a  here if true.  *
1d40: 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
1d50: 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65  ll    /* If true
1d60: 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72  , jump if either
1d70: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
1d80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b   */.){.  int p5;
1d90: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43  .  int addr;.  C
1da0: 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70  ollSeq *p4;..  p
1db0: 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  4 = sqlite3Binar
1dc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1dd0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1de0: 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62  Right);.  p5 = b
1df0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70  inaryCompareP5(p
1e00: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75  Left, pRight, ju
1e10: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  mpIfNull);.  add
1e20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1e30: 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56  ddOp4(pParse->pV
1e40: 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32  dbe, opcode, in2
1e50: 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20  , dest, in1,.   
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1e80: 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  4, P4_COLLSEQ);.
1e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1ea0: 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56  ngeP5(pParse->pV
1eb0: 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20  dbe, (u8)p5);.  
1ec0: 69 66 28 20 28 70 35 20 26 20 53 51 4c 49 54 45  if( (p5 & SQLITE
1ed0: 5f 41 46 46 5f 4d 41 53 4b 29 21 3d 53 51 4c 49  _AFF_MASK)!=SQLI
1ee0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1ef0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f00: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1f10: 65 28 70 50 61 72 73 65 2c 20 69 6e 31 2c 20 31  e(pParse, in1, 1
1f20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1f30: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1f40: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
1f50: 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  2, 1);.  }.  ret
1f60: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1f70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1f80: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1f90: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fa0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fb0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1fc0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
1fd0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
1fe0: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
1ff0: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2000: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2010: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2020: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2030: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2050: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2060: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2070: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
2080: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
2090: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20a0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20b0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20c0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
20d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20e0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
20f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2100: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2110: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2120: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2130: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2140: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2150: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2160: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
2170: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
2180: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
2190: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21a0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21b0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21c0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
21d0: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
21e0: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
21f0: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2200: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2210: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2220: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2230: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2240: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2250: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2260: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2270: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
2280: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
2290: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22a0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22b0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22c0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
22d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
22e0: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
22f0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2300: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2310: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2320: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2330: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2340: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2350: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2360: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
2370: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
2380: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
2390: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
23d0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
23e0: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
23f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2400: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2410: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2420: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2430: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2440: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2450: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2460: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2470: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
2480: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
2490: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24a0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24b0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24c0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
24d0: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
24e0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
24f0: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2500: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2510: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2520: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2530: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2540: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2550: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2560: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2570: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
2580: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
2590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25a0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25b0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25c0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
25d0: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
25e0: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
25f0: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2600: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2610: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2620: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2630: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2640: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2650: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2660: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
2670: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
2680: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
2690: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26a0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26b0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26c0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
26d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
26e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
26f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2700: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2710: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2720: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2740: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2750: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2760: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
2770: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
2780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
2790: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27a0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27b0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27c0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
27d0: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
27e0: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
27f0: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2800: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2810: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2820: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2830: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2840: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2850: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2860: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
2870: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
2880: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
2890: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28a0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28b0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28c0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
28d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
28e0: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
28f0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2900: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2910: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2920: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2930: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2940: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2950: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2960: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
2970: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
2980: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2990: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29a0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29b0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29c0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
29d0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
29e0: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
29f0: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a00: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a20: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a40: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a50: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a60: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2a70: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2a80: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2a90: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2aa0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ab0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2ac0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2ad0: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2ae0: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2af0: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b00: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b10: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b20: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b30: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b40: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b50: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b60: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2b70: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2b80: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2b90: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2ba0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2bb0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bc0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2bd0: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2be0: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2bf0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c00: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c10: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c20: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c30: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c40: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c50: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c60: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2c70: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2c80: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2c90: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2ca0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2cb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cc0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2cd0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2ce0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2cf0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d00: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d10: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d20: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d30: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d40: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d50: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d60: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2d70: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2d80: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2d90: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2da0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2db0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2dc0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2dd0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2de0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2df0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e00: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e10: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e20: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e30: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e40: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e50: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2e70: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2e80: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ea0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2eb0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ec0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2ed0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2ee0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2ef0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f00: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f10: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f20: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f30: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f40: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f50: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f60: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2f70: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2f80: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2f90: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fa0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fb0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2fc0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
2fd0: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
2fe0: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20  en->n+1;.    }. 
2ff0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
3000: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3010: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
3020: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
3030: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
3040: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
3050: 20 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20     pNew->iAgg = 
3060: 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b  -1;.    if( pTok
3070: 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  en ){.      if( 
3080: 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20  nExtra==0 ){.   
3090: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
30a0: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
30b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
30c0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
30d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30e0: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
30f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
3100: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70  oken = (char*)&p
3110: 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  New[1];.        
3120: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a  memcpy(pNew->u.z
3130: 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Token, pToken->z
3140: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20  , pToken->n);.  
3150: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
3160: 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20  oken[pToken->n] 
3170: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
3180: 20 64 65 71 75 6f 74 65 20 26 26 20 6e 45 78 74   dequote && nExt
3190: 72 61 3e 3d 33 20 0a 20 20 20 20 20 20 20 20 20  ra>=3 .         
31a0: 20 20 20 20 26 26 20 28 28 63 20 3d 20 70 54 6f      && ((c = pTo
31b0: 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27  ken->z[0])=='\''
31c0: 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d   || c=='"' || c=
31d0: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20  ='[' || c=='`') 
31e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31f0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
3200: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
3210: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22         if( c=='"
3220: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
3230: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
3240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3250: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c   }.    }.#if SQL
3260: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
3270: 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  TH>0.    pNew->n
3280: 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64  Height = 1;.#end
3290: 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  if  .  }.  retur
32a0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
32b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
32c0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
32d0: 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d  from a zero-term
32e0: 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61  inated token tha
32f0: 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  t has.** already
3300: 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a   been dequoted..
3310: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3320: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
3330: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
3340: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
3350: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
3360: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
3370: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3390: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
33a0: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
33b0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20  har *zToken     
33c0: 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65   /* Token argume
33d0: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
33e0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  LL */.){.  Token
33f0: 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b   x;.  x.z = zTok
3400: 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b  en;.  x.n = zTok
3410: 65 6e 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c  en ? sqlite3Strl
3420: 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30  en30(zToken) : 0
3430: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
3440: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
3450: 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  op, &x, 0);.}../
3460: 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74  *.** Attach subt
3470: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3480: 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70  Right to the Exp
3490: 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a  r node pRoot..**
34a0: 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55  .** If pRoot==NU
34b0: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
34c0: 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  at a memory allo
34d0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
34e0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e   occurred..** In
34f0: 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65   that case, dele
3500: 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  te the subtrees 
3510: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3520: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3530: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
3540: 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ees(.  sqlite3 *
3550: 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f  db,.  Expr *pRoo
3560: 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  t,.  Expr *pLeft
3570: 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ,.  Expr *pRight
3580: 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d  .){.  if( pRoot=
3590: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
35a0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
35b0: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
35c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
35d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
35e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
35f0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
3600: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67  se{.    if( pRig
3610: 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ht ){.      pRoo
3620: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  t->pRight = pRig
3630: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  ht;.      if( pR
3640: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
3650: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
3660: 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c         pRoot->fl
3670: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
3680: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  late;.        pR
3690: 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69  oot->pColl = pRi
36a0: 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ght->pColl;.    
36b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
36c0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
36d0: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
36e0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
36f0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
3700: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
3730: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
3740: 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pRoot->pColl = p
3750: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Left->pColl;.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
3770: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
3780: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
3790: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70  * Allocate a Exp
37a0: 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69  r node which joi
37b0: 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77  ns as many as tw
37c0: 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a  o subtrees..**.*
37d0: 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  * One or both of
37e0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61   the subtrees ca
37f0: 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75  n be NULL.  Retu
3800: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3810: 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20  the new.** Expr 
3820: 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e  node.  Or, if an
3830: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
3840: 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64  s, set pParse->d
3850: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c  b->mallocFailed,
3860: 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62  .** free the sub
3870: 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e  trees and return
3880: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a   NULL..*/.Expr *
3890: 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20  sqlite3PExpr(.  
38a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
38c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
38d0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
38f0: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3900: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
3910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
3920: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
3930: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
3940: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
3950: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
3960: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
3970: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
3980: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45   token */.){.  E
3990: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
39a0: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
39b0: 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e  ->db, op, pToken
39c0: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 1);.  sqlite3E
39d0: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
39e0: 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c  s(pParse->db, p,
39f0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
3a00: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3a10: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
3a20: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
3a30: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3a40: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
3a50: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
3a60: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
3a70: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
3a80: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
3a90: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
3aa0: 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
3ab0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
3ac0: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
3ad0: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
3ae0: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
3af0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
3b00: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
3b10: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
3b20: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
3b30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
3b40: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
3b50: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
3b60: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3b70: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
3b80: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3b90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
3ba0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
3bb0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
3bc0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
3bd0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
3be0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
3bf0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
3c00: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
3c10: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
3c20: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
3c30: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
3c40: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
3c50: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
3c60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
3c70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
3c80: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
3c90: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
3ca0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
3cb0: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
3cc0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
3cd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
3ce0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
3cf0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
3d00: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
3d10: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
3d20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3d30: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
3d40: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
3d50: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
3d60: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
3d70: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
3d80: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
3d90: 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  t(pParse, pNew);
3da0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3db0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
3dc0: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
3dd0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
3de0: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
3df0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
3e00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
3e10: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
3e20: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
3e30: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
3e40: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
3e50: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
3e60: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
3e70: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
3e80: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
3e90: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
3ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
3eb0: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
3ec0: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
3ed0: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
3ee0: 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61  oo be to avoid a
3ef0: 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69   denial of servi
3f00: 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a  ce attack when.*
3f10: 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
3f20: 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  ent comes from a
3f30: 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63  n external sourc
3f40: 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  e..**.** Wildcar
3f50: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
3f60: 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f  :aaa", "@aaa", o
3f70: 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73  r "$aaa" are ass
3f80: 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e  igned the same n
3f90: 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20  umber.** as the 
3fa0: 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63  previous instanc
3fb0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69  e of the same wi
3fc0: 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74  ldcard.  Or if t
3fd0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
3fe0: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
3ff0: 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68  the wildcard, th
4000: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c  e next sequenial
4010: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4020: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
4030: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4040: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
4050: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
4060: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
4070: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4080: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63   pParse->db;.  c
4090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  onst char *z;.. 
40a0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
40b0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
40c0: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
40d0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
40e0: 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75  IntValue|EP_Redu
40f0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
4100: 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72  ) );.  z = pExpr
4110: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73  ->u.zToken;.  as
4120: 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
4130: 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20  assert( z[0]!=0 
4140: 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30  );.  if( z[1]==0
4150: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
4160: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
4170: 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65  "?".  Assign the
4180: 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e   next variable n
4190: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  umber */.    ass
41a0: 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29  ert( z[0]=='?' )
41b0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  ;.    pExpr->iCo
41c0: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b  lumn = (ynVar)(+
41d0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
41e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
41f0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
4200: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
4210: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
4220: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
4230: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
4240: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
4250: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
4260: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20  er */.    int i 
4270: 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 7a  = atoi((char*)&z
4280: 5b 31 5d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  [1]);.    pExpr-
4290: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61  >iColumn = (ynVa
42a0: 72 29 69 3b 0a 20 20 20 20 74 65 73 74 63 61 73  r)i;.    testcas
42b0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 74  e( i==0 );.    t
42c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
42d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
42e0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
42f0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4300: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
4310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4320: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
4330: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
4340: 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20  E_NUMBER] );.   
4350: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 64 62   if( i<1 || i>db
4360: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4370: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4380: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
4390: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
43a0: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
43b0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
43c0: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
43d0: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
43e0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
43f0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4400: 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d  _NUMBER]);.    }
4410: 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73  .    if( i>pPars
4420: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
4430: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
4440: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  i;.    }.  }else
4450: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
4460: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
4470: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
4480: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
4490: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  e variable.    *
44a0: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
44b0: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
44c0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
44d0: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
44e0: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76  e.    ** has nev
44f0: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
4500: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
4510: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
4520: 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  er.    */.    in
4530: 74 20 69 3b 0a 20 20 20 20 75 33 32 20 6e 3b 0a  t i;.    u32 n;.
4540: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
4550: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
4560: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
4570: 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b  e->nVarExpr; i++
4580: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
4590: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
45a0: 72 45 78 70 72 5b 69 5d 3b 0a 20 20 20 20 20 20  rExpr[i];.      
45b0: 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
45c0: 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
45d0: 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  p(pE->u.zToken, 
45e0: 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 70 45 2d 3e  z, n)==0 && pE->
45f0: 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d 3d 30 20 29  u.zToken[n]==0 )
4600: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
4610: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 2d 3e 69  >iColumn = pE->i
4620: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
4630: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4640: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
4650: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4660: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
4670: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61  >iColumn = (ynVa
4680: 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61  r)(++pParse->nVa
4690: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  r);.      if( pP
46a0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
46b0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
46c0: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
46d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
46e0: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
46f0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
4700: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
4710: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
4720: 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r =.            
4730: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4740: 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20 20  OrFree(.        
4750: 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
4760: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4770: 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20  apVarExpr,.     
4780: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
4790: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73  >nVarExprAlloc*s
47a0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70  izeof(pParse->ap
47b0: 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20 20  VarExpr[0]).    
47c0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
47d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64 62   }.      if( !db
47e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
47f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4800: 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  ( pParse->apVarE
4810: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
4820: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
4830: 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72  xpr[pParse->nVar
4840: 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b  Expr++] = pExpr;
4850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4860: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
4870: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
4880: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
4890: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
48a0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
48b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
48c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
48d0: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
48e0: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
48f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4900: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4910: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4930: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4940: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4950: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4960: 75 72 6e 3b 0a 20 20 69 66 28 20 21 45 78 70 72  urn;.  if( !Expr
4970: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
4980: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
4990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
49a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
49b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
49c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
49d0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
49e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
49f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
4a00: 75 63 65 64 29 20 26 26 20 28 70 2d 3e 66 6c 61  uced) && (p->fla
4a10: 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63  gs2 & EP2_Malloc
4a20: 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  edToken)!=0 ){. 
4a30: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4a40: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  ee(db, p->u.zTok
4a50: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  en);.    }.    i
4a60: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
4a70: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
4a80: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
4a90: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4aa0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
4ab0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
4ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4ad0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4ae0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
4af0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70  }.  }.  if( !Exp
4b00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4b10: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
4b20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4b30: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
4b40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4b50: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
4b60: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4b70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  e expression str
4b80: 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65  ucture .** passe
4b90: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
4ba0: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
4bb0: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
4bc0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a  XPR_FULLSIZE,.**
4bd0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
4be0: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
4bf0: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
4c00: 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63  ic int exprStruc
4c10: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a  tSize(Expr *p){.
4c20: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4c30: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
4c40: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
4c50: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
4c60: 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  ZE;.  if( ExprHa
4c70: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
4c80: 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72  Reduced) ) retur
4c90: 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  n EXPR_REDUCEDSI
4ca0: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50  ZE;.  return EXP
4cb0: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f  R_FULLSIZE;.}../
4cc0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
4cd0: 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e  pr*Size() routin
4ce0: 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74  es each return t
4cf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4d00: 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  es required.** t
4d10: 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f  o store a copy o
4d20: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
4d30: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  or expression tr
4d40: 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72  ee.  They differ
4d50: 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20   in.** how much 
4d60: 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d  of the tree is m
4d70: 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  easured..**.**  
4d80: 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75     dupedExprStru
4d90: 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a  ctSize()     Siz
4da0: 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78  e of only the Ex
4db0: 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  pr structure .**
4dc0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f       dupedExprNo
4dd0: 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53  deSize()       S
4de0: 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70  ize of Expr + sp
4df0: 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a  ace for token.**
4e00: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69       dupedExprSi
4e10: 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45  ze()           E
4e20: 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75  xpr + token + su
4e30: 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  btree components
4e40: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
4e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4e90: 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  **.** The dupedE
4ea0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
4eb0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4ec0: 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65   two values OR-e
4ed0: 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a  d together:  .**
4ee0: 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72   (1) the space r
4ef0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f  equired for a co
4f00: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
4f10: 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e  tructure only an
4f20: 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50  d .** (2) the EP
4f30: 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20  _xxx flags that 
4f40: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
4f50: 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65  e structure size
4f60: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54   should be..** T
4f70: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  he return values
4f80: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
4f90: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58  f:.**.**      EX
4fa0: 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20  PR_FULLSIZE.**  
4fb0: 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44      EXPR_REDUCED
4fc0: 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75  SIZE   | EP_Redu
4fd0: 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  ced.**      EXPR
4fe0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
4ff0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a   EP_TokenOnly.**
5000: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5010: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61  the structure ca
5020: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
5030: 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  sking the return
5040: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69   value.** of thi
5050: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30  s routine with 0
5060: 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73  xfff.  The flags
5070: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
5080: 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20   masking the.** 
5090: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74  return value wit
50a0: 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  h EP_Reduced|EP_
50b0: 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  TokenOnly..**.**
50c0: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20   Note that with 
50d0: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
50e0: 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74  EDUCE, this rout
50f0: 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75  ines works on fu
5100: 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65  ll-size.** (unre
5110: 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65  duced) Expr obje
5120: 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f  cts as they or o
5130: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72  riginally constr
5140: 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72  ucted by the par
5150: 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65  ser..** During e
5160: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
5170: 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  is, extra inform
5180: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65  ation is compute
5190: 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f  d and moved into
51a0: 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20  .** later parts 
51b0: 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65  of teh Expr obje
51c0: 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72  ct and that extr
51d0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69  a information mi
51e0: 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a  ght get chopped.
51f0: 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78  ** off if the ex
5200: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75  pression is redu
5210: 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ced.  Note also 
5220: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
5230: 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65   work to.** make
5240: 20 61 20 45 58 50 52 44 55 50 5f 52 45 44 55 43   a EXPRDUP_REDUC
5250: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
5260: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
5270: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
5280: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
5290: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
52a0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
52b0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
52c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
52d0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
52e0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
52f0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
5300: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
5310: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
5320: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
5330: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
5340: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
5350: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
5360: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5370: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
5380: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
5390: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
53a0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
53b0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
53c0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
53d0: 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67 73  .  if( 0==(flags
53e0: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29  &EXPRDUP_REDUCE)
53f0: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
5400: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20  EXPR_FULLSIZE;. 
5410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5420: 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
5430: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
5440: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
5450: 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ed) );.    asser
5460: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5470: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
5480: 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65  in) ); .    asse
5490: 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26  rt( (p->flags2 &
54a0: 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b   EP2_MallocedTok
54b0: 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  en)==0 );.    as
54c0: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32  sert( (p->flags2
54d0: 20 26 20 45 50 32 5f 49 72 72 65 64 75 63 69 62   & EP2_Irreducib
54e0: 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  le)==0 );.    if
54f0: 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d  ( p->pLeft || p-
5500: 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e 70 43  >pRight || p->pC
5510: 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73  oll || p->x.pLis
5520: 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  t ){.      nSize
5530: 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53   = EXPR_REDUCEDS
5540: 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64  IZE | EP_Reduced
5550: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5560: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
5570: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5580: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
5590: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
55a0: 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nSize;.}../*.**
55b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
55c0: 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65  eturns the space
55d0: 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72   in bytes requir
55e0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
55f0: 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20  copy .** of the 
5600: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61  Expr structure a
5610: 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
5620: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73   Expr.u.zToken s
5630: 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a  tring (if that.*
5640: 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69  * string is defi
5650: 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ned.).*/.static 
5660: 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64  int dupedExprNod
5670: 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  eSize(Expr *p, i
5680: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
5690: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
56a0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
56b0: 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a  flags) & 0xfff;.
56c0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
56d0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
56e0: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
56f0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79  Token ){.    nBy
5700: 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
5710: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
5720: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
5730: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
5740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5750: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5760: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
5770: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
5780: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
5790: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
57a0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
57b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
57c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
57d0: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
57e0: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
57f0: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
5800: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
5810: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
5820: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
5830: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
5840: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
5850: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
5860: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
5870: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
5880: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
5890: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
58a0: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
58b0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
58c0: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
58d0: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
58e0: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
58f0: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
5900: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
5910: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
5920: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
5930: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
5940: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
5950: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
5960: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
5970: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
5980: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
5990: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
59a0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
59b0: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
59c0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
59d0: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
59e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
59f0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
5a00: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
5a10: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
5a20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
5a30: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
5a40: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
5a50: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
5a60: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
5a70: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
5a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5a90: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
5aa0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
5ab0: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
5ac0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
5ad0: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
5ae0: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
5af0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
5b00: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
5b10: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
5b20: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
5b30: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
5b40: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
5b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
5b60: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
5b70: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
5b80: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
5b90: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
5ba0: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
5bb0: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
5bc0: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
5bd0: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
5be0: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
5bf0: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
5c00: 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74 68  t byte passed th
5c10: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
5c20: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
5c30: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
5c40: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
5c50: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
5c60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
5c70: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5c80: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
5c90: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d  {.  Expr *pNew =
5ca0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
5cc0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
5cd0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6f   if( p ){.    co
5ce0: 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63 65  nst int isReduce
5cf0: 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52 44  d = (flags&EXPRD
5d00: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
5d10: 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  u8 *zAlloc;.    
5d20: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20 3d  u32 staticFlag =
5d30: 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   0;..    assert(
5d40: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
5d50: 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20 20  isReduced );..  
5d60: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5d70: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
5d80: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
5d90: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69 66  cture. */.    if
5da0: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
5db0: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
5dc0: 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73 74  Buffer;.      st
5dd0: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
5de0: 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  atic;.    }else{
5df0: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
5e00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5e10: 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  aw(db, dupedExpr
5e20: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29 3b  Size(p, flags));
5e30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 20  .    }.    pNew 
5e40: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
5e50: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  ;..    if( pNew 
5e60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ){.      /* Set 
5e70: 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20  nNewSize to the 
5e80: 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  size allocated f
5e90: 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
5ea0: 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20   pointed to.    
5eb0: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
5ec0: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
5ed0: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
5ee0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
5ef0: 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f        ** EXPR_TO
5f00: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
5f10: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
5f20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5f30: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20  s consumed.     
5f40: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
5f50: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
5f60: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
5f70: 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
5f80: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
5f90: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
5fa0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5fb0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
5fc0: 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e       const int n
5fd0: 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63  NewSize = nStruc
5fe0: 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20  tSize & 0xfff;. 
5ff0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b       int nToken;
6000: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
6010: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6020: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
6030: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
6040: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
6050: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
6060: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
6070: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6080: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
6090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
60a0: 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29 7b  if( isReduced ){
60b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
60c0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
60d0: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
60e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  =0 );.        me
60f0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
6100: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20  nNewSize);.     
6110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6120: 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70 72  int nSize = expr
6130: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
6140: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41         memcpy(zA
6150: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
6160: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
6170: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
6180: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
6190: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
61a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
61b0: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
61c0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
61d0: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
61e0: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
61f0: 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  */.      pNew->f
6200: 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64  lags &= ~(EP_Red
6210: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
6220: 79 7c 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20  y|EP_Static);.  
6230: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6240: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
6250: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
6260: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
6270: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6280: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
6290: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
62a0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
62b0: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
62c0: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20       if( nToken 
62d0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
62e0: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
62f0: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6300: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
6310: 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze];.        mem
6320: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
6330: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
6340: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6350: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
6360: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
6370: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
6380: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ){.        /* Fi
6390: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
63a0: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
63b0: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
63c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
63d0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
63e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
63f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
6400: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
6410: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
6420: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
6430: 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ect, isReduced);
6440: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6450: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6460: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
6470: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
6480: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52   p->x.pList, isR
6490: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
64a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
64b0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
64c0: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
64d0: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
64e0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41      if( ExprHasA
64f0: 6e 79 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  nyProperty(pNew,
6500: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
6510: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
6520: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64       zAlloc += d
6530: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6540: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6550: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
6560: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
6570: 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20  _Reduced) ){.   
6580: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
6590: 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c  ft = exprDup(db,
65a0: 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44   p->pLeft, EXPRD
65b0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
65c0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  oc);.          p
65d0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65 78  New->pRight = ex
65e0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
65f0: 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ght, EXPRDUP_RED
6600: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
6610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6620: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
6630: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42 75  .          *pzBu
6640: 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20  ffer = zAlloc;. 
6650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
6670: 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20 30 3b 0a  ew->flags2 = 0;.
6680: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
6690: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
66a0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
66b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
66c0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
66d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
66e0: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
66f0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
6700: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
6710: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
6720: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
6730: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d  }.      }..    }
6740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
6750: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ew;.}../*.** The
6760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
6770: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
6780: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
6790: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
67a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
67b0: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
67c0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
67d0: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
67e0: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
67f0: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
6800: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
6810: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
6820: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
6830: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
6840: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
6850: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
6860: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
6870: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
6880: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
6890: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
68a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
68b0: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
68c0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
68d0: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
68e0: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
68f0: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
6900: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
6910: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
6920: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
6930: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
6940: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
6950: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
6960: 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  plicated..**.** 
6970: 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  The flags parame
6980: 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ter contains a c
6990: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
69a0: 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  e EXPRDUP_XXX fl
69b0: 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45  ags..** If the E
69c0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
69d0: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
69e0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
69f0: 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74  turned is a.** t
6a00: 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e  runcated version
6a10: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78   of the usual Ex
6a20: 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  pr structure tha
6a30: 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
6a40: 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74   as.** part of t
6a50: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
6a60: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
6a70: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
6a80: 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ma..*/.Expr *sql
6a90: 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69  ite3ExprDup(sqli
6aa0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
6ab0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6ac0: 72 65 74 75 72 6e 20 65 78 70 72 44 75 70 28 64  return exprDup(d
6ad0: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b  b, p, flags, 0);
6ae0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
6af0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
6b10: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
6b20: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
6b30: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
6b40: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6b50: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
6b60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
6b70: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
6b80: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
6b90: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6ba0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
6bb0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
6bc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
6bd0: 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  New->iECursor = 
6be0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
6bf0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
6c00: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
6c10: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
6c20: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6c30: 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72  aw(db,  p->nExpr
6c40: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
6c50: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
6c60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6c70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
6c80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
6c90: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
6ca0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
6cb0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
6cc0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
6cd0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
6ce0: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
6cf0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
6d00: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
6d10: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
6d20: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
6d30: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
6d40: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
6d50: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
6d60: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
6d70: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
6d80: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
6d90: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
6da0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
6db0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
6dc0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
6dd0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
6de0: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
6df0: 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f  pItem->iCol = pO
6e00: 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20  ldItem->iCol;.  
6e10: 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
6e20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c 69  = pOldItem->iAli
6e30: 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  as;.  }.  return
6e40: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6e50: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
6e60: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
6e70: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
6e80: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
6e90: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
6ea0: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
6eb0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
6ec0: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
6ed0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
6ee0: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
6ef0: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
6f00: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
6f10: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
6f20: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
6f30: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
6f40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6f50: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
6f60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
6f70: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
6f80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6f90: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
6fa0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
6fb0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
6fc0: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
6fd0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
6fe0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
6ff0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
7000: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
7010: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
7020: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
7030: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
7040: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
7050: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
7060: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7070: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7080: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
7090: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
70a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
70b0: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
70c0: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
70d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
70e0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
70f0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
7100: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
7110: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
7120: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7130: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
7140: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
7150: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
7160: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
7170: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7180: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7190: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
71a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
71b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
71c0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
71d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
71e0: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
71f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7200: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
7210: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
7220: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20  tem->jointype = 
7230: 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pOldItem->jointy
7240: 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  pe;.    pNewItem
7250: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
7260: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
7270: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50     pNewItem->isP
7280: 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49  opulated = pOldI
7290: 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
72a0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
72b0: 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
72c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
72d0: 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  dItem->zIndex);.
72e0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f      pNewItem->no
72f0: 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49  tIndexed = pOldI
7300: 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b  tem->notIndexed;
7310: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7320: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
7330: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
7340: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
7350: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
7360: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
7370: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
7380: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
7390: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
73a0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
73b0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
73c0: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
73d0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
73e0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
73f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7400: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
7410: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7420: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
7430: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
7440: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
7450: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
7460: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
7470: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
7480: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7490: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
74a0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
74b0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
74c0: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
74d0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
74e0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
74f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7500: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7510: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7520: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7530: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7540: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
7550: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
7560: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
7570: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7580: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
7590: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
75a0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
75b0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
75c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
75d0: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
75e0: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
75f0: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
7600: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
7610: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7620: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7630: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
7640: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
7650: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
7660: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
7670: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7690: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
76a0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
76b0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
76c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
76d0: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
76e0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
76f0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
7700: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7710: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
7720: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7730: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7740: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7750: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7760: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
7770: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7780: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
7790: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
77a0: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
77b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
77c0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
77d0: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
77e0: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
77f0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
7800: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7810: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
7820: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7830: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
7840: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7850: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
7860: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
7870: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
7880: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
7890: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
78a0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
78b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
78c0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
78d0: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
78e0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
78f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
7900: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7910: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
7920: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  r, flags);.  pNe
7930: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
7940: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7950: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
7960: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
7970: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7980: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
7990: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
79a0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
79b0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
79c0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
79d0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
79e0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
79f0: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
7a00: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
7a10: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7a20: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
7a30: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
7a40: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
7a50: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7a60: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
7a70: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
7a80: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
7a90: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
7aa0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
7ab0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7ac0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
7ad0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7ae0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
7af0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
7b00: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
7b10: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
7b20: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
7b30: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
7b40: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
7b50: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
7b60: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
7b70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7b80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
7b90: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
7ba0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
7bb0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
7bc0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
7bd0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
7be0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
7bf0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
7c00: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
7c10: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
7c20: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
7c30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7c40: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
7c50: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7c60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7c70: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
7c80: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
7c90: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
7ca0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
7cb0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
7cc0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
7cd0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7ce0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
7cf0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
7d00: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
7d10: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7d20: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
7d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
7d40: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7d50: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
7d60: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
7d70: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
7d80: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
7d90: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
7da0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
7db0: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
7dc0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
7dd0: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
7de0: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
7df0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
7e00: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
7e10: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
7e20: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
7e30: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
7e40: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
7e50: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
7e60: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
7e70: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
7e80: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
7e90: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
7ea0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
7eb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7ec0: 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a 65  Size(db, a)/size
7ed0: 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  of(a[0]);.  }.  
7ee0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
7ef0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
7f00: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
7f10: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
7f20: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
7f30: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
7f40: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
7f50: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
7f60: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
7f70: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
7f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
7f90: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
7fa0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
7fb0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
7fc0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
7fd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
7fe0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
7ff0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
8000: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
8010: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
8020: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
8030: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
8040: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
8050: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8060: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
8070: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
8080: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8090: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
80a0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
80b0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
80c0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
80d0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
80e0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
80f0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
8100: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
8110: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
8120: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
8130: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8140: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
8150: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8160: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8170: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8180: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8190: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
81a0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
81b0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
81c0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
81d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
81e0: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
81f0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
8200: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
8210: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
8220: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
8230: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
8240: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
8250: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8260: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
8270: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
8280: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8290: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
82a0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
82b0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
82c0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
82d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
82e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
82f0: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
8300: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
8310: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
8320: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
8330: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8340: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
8350: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
8360: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
8370: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
8380: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
8390: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
83a0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
83b0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
83c0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
83d0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
83e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
83f0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
8400: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
8410: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8420: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
8430: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8440: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8450: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8460: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8470: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8480: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
84a0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
84b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
84c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
84d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
84e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
84f0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8500: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8510: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8520: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
8530: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
8540: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
8550: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
8560: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8570: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
8580: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
8590: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
85a0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
85b0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
85c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
85d0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
85e0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
85f0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8600: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
8610: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
8620: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
8630: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
8640: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
8650: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8660: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
8670: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
8680: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8690: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
86a0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
86e0: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
86f0: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
8700: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
8710: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
8720: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
8730: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
8740: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
8750: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
8760: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
8770: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8780: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
8790: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
87a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
87b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
87c0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
87d0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
87e0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
87f0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
8800: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
8810: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
8820: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
8830: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
8840: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
8850: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
8860: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
8870: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
8880: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8890: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
88a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
88b0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
88c0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
88d0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
88e0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
88f0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
8900: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
8910: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
8920: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
8930: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8940: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8950: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
8960: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8970: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
8980: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   (pList->nExpr==
8990: 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  0 && pList->nAll
89a0: 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  oc==0) );.  asse
89b0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
89c0: 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  <=pList->nAlloc 
89d0: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
89e0: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
89f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8a00: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8a10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8a20: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
8a30: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8a40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8a50: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
8a60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8a70: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8a80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
8a90: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
8aa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8ab0: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
8ad0: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
8ae0: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
8af0: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
8b00: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8b10: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
8b20: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
8b30: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
8b40: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
8b50: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
8b60: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
8b70: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
8b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
8b90: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
8ba0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
8bb0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
8bc0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
8bd0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
8be0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
8bf0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8c00: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
8c10: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8c20: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
8c30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
8c40: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8c50: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
8c60: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
8c70: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
8c80: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
8c90: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
8ca0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
8cb0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
8cc0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
8cd0: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
8ce0: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
8cf0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
8d00: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
8d10: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
8d20: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
8d30: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
8d40: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
8d50: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
8d60: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
8d70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8d80: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
8d90: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
8da0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
8db0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
8dc0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
8dd0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
8de0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
8df0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
8e00: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
8e10: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
8e20: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
8e30: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20  pWalker->u.i==2 
8e40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
8e50: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
8e60: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
8e70: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
8e80: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8e90: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
8ea0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
8eb0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
8ec0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
8ed0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
8ee0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
8ef0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
8f00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
8f10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8f20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
8f30: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
8f40: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8f50: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
8f60: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
8f70: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8f80: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
8f90: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
8fa0: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
8fb0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
8fc0: 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  rt;.    default:
8fd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8fe0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
8ff0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
9000: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9010: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9020: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9030: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9040: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
9050: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9060: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
9070: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
9080: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
9090: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
90a0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
90b0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
90c0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
90d0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
90e0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
90f0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
9100: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
9110: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
9120: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
9130: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
9140: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
9150: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69  alker w;.  w.u.i
9160: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
9170: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
9180: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
9190: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
91a0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
91b0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
91c0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
91d0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
91e0: 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a  urn w.u.i;.}../*
91f0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9200: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9210: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9220: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9230: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
9240: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9250: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9260: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
9270: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
9280: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
9290: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
92a0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
92b0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
92c0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
92d0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
92e0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
92f0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
9300: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
9310: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9320: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
9330: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9340: 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a  sConst(p, 1);.}.
9350: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9360: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9370: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9380: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9390: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
93a0: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
93b0: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
93c0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
93d0: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
93e0: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
93f0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9400: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9410: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
9420: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
9430: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
9440: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9450: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
9460: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
9470: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
9480: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
9490: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
94a0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
94b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
94c0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
94d0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
94e0: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
94f0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
9500: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
9510: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
9520: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
9530: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9540: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9550: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9560: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
9570: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
9580: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
9590: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
95a0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
95b0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
95c0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
95d0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
95e0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
95f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
9600: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
9610: 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 2);.}../*.** 
9620: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9630: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
9640: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
9650: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
9660: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
9670: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9680: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
9690: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
96a0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
96b0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
96c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
96d0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
96e0: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
96f0: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
9700: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
9710: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9720: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
9730: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
9740: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9750: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
9760: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
9770: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
9780: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
9790: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
97a0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
97b0: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
97c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
97d0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
97e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
97f0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  GER: {.      rc 
9800: 3d 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  = sqlite3GetInt3
9810: 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  2(p->u.zToken, p
9820: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 61 73  Value);.      as
9830: 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
9840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9850: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
9860: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
9870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
9880: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
9890: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
98a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
98b0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
98c0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
98d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
98e0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
98f0: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9900: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9910: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9920: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9940: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
9950: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  eak;.  }.  if( r
9960: 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
9970: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
9980: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
9990: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 0a  d|EP_TokenOnly).
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
99b0: 7c 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  | (p->flags2 & E
99c0: 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e  P2_MallocedToken
99d0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6f  )==0 );.    p->o
99e0: 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
99f0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
9a00: 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
9a10: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 2a   p->u.iValue = *
9a20: 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 72 65  pValue;.  }.  re
9a30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9a40: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
9a50: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
9a60: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
9a70: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
9a80: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
9a90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
9aa0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
9ab0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9ac0: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
9ad0: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
9ae0: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
9af0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9b00: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
9b10: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
9b20: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
9b30: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
9b40: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
9b50: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
9b60: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
9b70: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
9b80: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
9b90: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
9ba0: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
9bb0: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
9bc0: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
9bd0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
9be0: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
9bf0: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
9c00: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
9c10: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
9c20: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
9c30: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
9c40: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
9c50: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
9c60: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
9c70: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
9c80: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
9c90: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
9ca0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
9cb0: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
9cc0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
9cd0: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
9ce0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
9cf0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
9d00: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
9d10: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
9d20: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
9d30: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
9d40: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
9d50: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
9d60: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
9d70: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
9d80: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
9d90: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
9da0: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
9db0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66  eturn 0;.    def
9dc0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
9dd0: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
9de0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f  ** Generate an O
9df0: 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63  P_IsNull instruc
9e00: 74 69 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20  tion that tests 
9e10: 72 65 67 69 73 74 65 72 20 69 52 65 67 20 61 6e  register iReg an
9e20: 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f  d jumps.** to lo
9e30: 63 61 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20  cation iDest if 
9e40: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65  the value in iRe
9e50: 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20  g is NULL.  The 
9e60: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a  value in iReg .*
9e70: 2a 20 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62  * was computed b
9e80: 79 20 70 45 78 70 72 2e 20 20 49 66 20 77 65 20  y pExpr.  If we 
9e90: 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70  can look at pExp
9ea0: 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  r at compile-tim
9eb0: 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69  e and.** determi
9ec0: 6e 65 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e  ne that it can n
9ed0: 65 76 65 72 20 67 65 6e 65 72 61 74 65 20 61 20  ever generate a 
9ee0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f  NULL, then the O
9ef0: 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69  P_IsNull operati
9f00: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
9f10: 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
9f20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
9f30: 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20  ullJump(.  Vdbe 
9f40: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v,            /
9f50: 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
9f60: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
9f70: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  .  const Expr *p
9f80: 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67  Expr,  /* Only g
9f90: 65 6e 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c  enerate OP_IsNul
9fa0: 6c 20 69 66 20 74 68 69 73 20 65 78 70 72 20 63  l if this expr c
9fb0: 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  an be NULL */.  
9fc0: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
9fd0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20      /* Test the 
9fe0: 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
9ff0: 67 69 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20  gister for NULL 
a000: 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20  */.  int iDest  
a010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
a020: 20 68 65 72 65 20 69 66 20 74 68 65 20 76 61 6c   here if the val
a030: 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ue is null */.){
a040: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
a050: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70  prCanBeNull(pExp
a060: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
a070: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a080: 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20  P_IsNull, iReg, 
a090: 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iDest);.  }.}../
a0a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
a0b0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
a0c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
a0d0: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
a0e0: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
a0f0: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
a100: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
a110: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
a120: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
a130: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
a140: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a150: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
a160: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
a170: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
a180: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
a190: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
a1a0: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
a1b0: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
a1c0: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
a1d0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
a1e0: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
a1f0: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
a200: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
a210: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
a220: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
a230: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
a240: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
a250: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
a260: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
a270: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
a280: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
a290: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
a2a0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
a2b0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
a2c0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
a2d0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
a2e0: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
a2f0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
a300: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
a310: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
a320: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
a330: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
a340: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a350: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
a360: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
a370: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
a380: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
a390: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
a3a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
a3b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a3c0: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
a3d0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
a3e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
a3f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a400: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
a410: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
a420: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
a430: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
a440: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
a450: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
a460: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
a470: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
a480: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
a490: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
a4a0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
a4b0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
a4c0: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
a4d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
a4e0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
a4f0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a500: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
a510: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
a520: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
a530: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
a540: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
a550: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
a560: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
a570: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
a580: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
a590: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
a5a0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
a5b0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
a5c0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
a5d0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
a5e0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
a5f0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
a600: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
a610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a620: 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  n true if we are
a630: 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20   able to the IN 
a640: 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a  operator optimiz
a650: 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75  ation on a.** qu
a660: 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
a670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e  **.**       x IN
a680: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
a690: 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45  .** Where the SE
a6a0: 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69  LECT... clause i
a6b0: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62  s as specified b
a6c0: 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  y the parameter 
a6d0: 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  to this.** routi
a6e0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65  ne..**.** The Se
a6f0: 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73  lect object pass
a700: 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64  ed in has alread
a710: 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73  y been preproces
a720: 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72  sed and no.** er
a730: 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66  rors have been f
a740: 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ound..*/.#ifndef
a750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a760: 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74  QUERY.static int
a770: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
a780: 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  nOpt(Select *p){
a790: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
a7a0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
a7b0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
a7c0: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
a7d0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7f0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
a800: 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54   of IN is SELECT
a810: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
a820: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a840: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
a850: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
a860: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
a870: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
a880: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
a890: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
a8a0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
a8b0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
a8c0: 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
a8d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
a8e0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
a8f0: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
a900: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
a910: 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
a920: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
a930: 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
a940: 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
a950: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
a960: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a970: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a990: 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
a9a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
a9b0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
a9c0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
a9d0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
a9e0: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
a9f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
aa00: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
aa10: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
aa20: 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
aa30: 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
aa40: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
aa50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
aa60: 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
aa70: 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
aa80: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
aa90: 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
aaa0: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
aab0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
aac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
aad0: 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
aae0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
aaf0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
ab00: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
ab10: 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
ab20: 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
ab30: 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
ab40: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
ab50: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54  ;.  if( NEVER(pT
ab60: 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  ab==0) ) return 
ab70: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  0;.  assert( pTa
ab80: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
aba0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
abb0: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
abc0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
abd0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
abe0: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
abf0: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
ac00: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
ac10: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
ac20: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
ac30: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
ac40: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
ac50: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
ac60: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
ac70: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
ac80: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
ac90: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
aca0: 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20   /* Result is a 
acb0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75  column */.  retu
acc0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
acd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
ace0: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
acf0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ad00: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
ad10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
ad20: 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
ad30: 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a  rator..** It's j
ad40: 6f 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ob is to find or
ad50: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
ad60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
ad70: 6d 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65  may be used.** e
ad80: 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
ad90: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20  r membership of 
ada0: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72  the (...) set or
adb0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
adc0: 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65  ugh.** its membe
add0: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70  rs, skipping dup
ade0: 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  licates..**.** T
adf0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
ae00: 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e  cursor opened on
ae10: 20 74 68 65 20 62 2d 74 72 65 65 20 28 64 61 74   the b-tree (dat
ae20: 61 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74  abase table, dat
ae30: 61 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20  abase index .** 
ae40: 6f 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c  or ephermal tabl
ae50: 65 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  e) is stored in 
ae60: 70 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72  pX->iTable befor
ae70: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
ae80: 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20  returns..** The 
ae90: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f  returned value o
aea0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
aeb0: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d  indicates the b-
aec0: 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f  tree type, as fo
aed0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49  llows:.**.**   I
aee0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20  N_INDEX_ROWID - 
aef0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
af00: 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
af10: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
af20: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d  IN_INDEX_INDEX -
af30: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
af40: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
af50: 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  base index..**  
af60: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20   IN_INDEX_EPH - 
af70: 20 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73    The cursor was
af80: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65   opened on a spe
af90: 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61  cially created a
afa0: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
afb0: 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
afc0: 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
afd0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  le..**.** An exi
afe0: 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 61 79  sting b-tree may
aff0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
b000: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
b010: 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20  f the simple.** 
b020: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
b030: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
b040: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
b050: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
b060: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
b070: 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d  s 0, then the b-
b080: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
b090: 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
b0a0: 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
b0b0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
b0c0: 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73  g any duplicates
b0d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
b0e0: 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74  n.** epheremal t
b0f0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
b100: 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
b110: 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69  ected <column> i
b120: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
b130: 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
b140: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
b150: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
b160: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74  RIMARY KEY or it
b170: 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45  .** has a UNIQUE
b180: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55   constraint or U
b190: 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a  NIQUE index..**.
b1a0: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
b1b0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
b1c0: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68  s not 0, then th
b1d0: 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
b1e0: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
b1f0: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
b200: 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73  p tests. In this
b210: 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d   case an epherem
b220: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
b230: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
b240: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
b250: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
b260: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
b270: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
b280: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
b290: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
b2a0: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  column..**.** Wh
b2b0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
b2c0: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
b2d0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
b2e0: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
b2f0: 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20  nction.** needs 
b300: 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
b310: 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63  or not the struc
b320: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ture contains an
b330: 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61   SQL NULL .** va
b340: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
b350: 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61  correctly evalua
b360: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  te expressions l
b370: 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29  ike "X IN (Y, Z)
b380: 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  "..** If there i
b390: 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
b3a0: 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
b3b0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
b3c0: 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
b3d0: 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
b3e0: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
b3f0: 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
b400: 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
b410: 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46  en.** to *prNotF
b420: 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69  ound. If there i
b430: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
b440: 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61   the (...) conta
b450: 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
b460: 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74  lue, then *prNot
b470: 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e  Found is left un
b480: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
b490: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
b4a0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
b4b0: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
b4c0: 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  d in *prNotFound
b4d0: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e  , then.** its in
b4e0: 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e  itial value is N
b4f0: 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e  ULL.  If the (..
b500: 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61  .) does not rema
b510: 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66  in constant.** f
b520: 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20  or the duration 
b530: 6f 66 20 74 68 65 20 71 75 65 72 79 20 28 69 2e  of the query (i.
b540: 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20 77 69  e. the SELECT wi
b550: 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a  thin the (...).*
b560: 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  * is a correlate
b570: 64 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  d subquery) then
b580: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
b590: 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69  e allocated regi
b5a0: 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74  ster is.** reset
b5b0: 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69   to NULL each ti
b5c0: 6d 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  me the subquery 
b5d0: 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61  is rerun. This a
b5e0: 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c  llows the.** cal
b5f0: 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62 65 20  ler to use vdbe 
b600: 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20  code equivalent 
b610: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
b620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65  :.**.**   if( re
b630: 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a  gister==NULL ){.
b640: 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20  **     has_null 
b650: 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20  = <test if data 
b660: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
b670: 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20  ns null>.**     
b680: 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20  register = 1.** 
b690: 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64    }.**.** in ord
b6a0: 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e  er to avoid runn
b6b0: 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66  ing the <test if
b6c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
b6d0: 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a  contains null>.*
b6e0: 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65  * test more ofte
b6f0: 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73  n than is necess
b700: 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ary..*/.#ifndef 
b710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b720: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
b730: 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73  FindInIndex(Pars
b740: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
b750: 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46  *pX, int *prNotF
b760: 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20  ound){.  Select 
b770: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b790: 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
b7a0: 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
b7b0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
b7c0: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
b7f0: 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
b800: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
b810: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
b830: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
b840: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
b850: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28  mustBeUnique = (
b860: 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20  prNotFound==0); 
b870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
b880: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
b890: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
b8a0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a  ->op==TK_IN );..
b8b0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
b8c0: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
b8d0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
b8e0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
b8f0: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
b900: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
b910: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
b920: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
b930: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
b940: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
b950: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
b960: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
b970: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
b980: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
b990: 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e  ALWAYS(pParse->n
b9a0: 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e  Err==0) && isCan
b9b0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
b9c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b9d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b9e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
b9f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
ba00: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  ection */.    Ex
ba10: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70  pr *pExpr = p->p
ba20: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
ba30: 72 3b 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  r;   /* Expressi
ba40: 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  on <column> */. 
ba50: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
ba60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20  xpr->iColumn;   
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ba80: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f  ex of column <co
ba90: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62  lumn> */.    Vdb
baa0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bab0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
bac0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
bad0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
bae0: 65 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  ed */.    Table 
baf0: 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d  *pTab = p->pSrc-
bb00: 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20 20 20 20  >a[0].pTab;     
bb10: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
bb20: 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  >. */.    int iD
bb30: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
bb60: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
bb70: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
bb80: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
bb90: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
bba0: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
bbb0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
bbc0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
bbd0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
bbe0: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
bbf0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
bc00: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
bc10: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
bc20: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
bc30: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
bc40: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
bc50: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
bc60: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
bc70: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
bc80: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
bc90: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
bca0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
bcb0: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
bcc0: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
bcd0: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
bce0: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
bcf0: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
bd00: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
bd10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
bd20: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  {.      int iMem
bd30: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
bd40: 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  m;.      int iAd
bd50: 64 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72  dr;..      iAddr
bd60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bd70: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69  dOp1(v, OP_If, i
bd80: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
bd90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bda0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
bdb0: 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71  iMem);..      sq
bdc0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
bdd0: 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
bde0: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
bdf0: 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
be00: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
be10: 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
be20: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
be30: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
be40: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
be50: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
be80: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  able */..      /
be90: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
bea0: 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79  sequence used by
beb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
bec0: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20   If an index is 
bed0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75  to.      ** be u
bee0: 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
bef0: 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74  a temp-table, it
bf00: 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64   must be ordered
bf10: 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20   according.     
bf20: 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c   ** to this coll
bf30: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20  ation sequence. 
bf40: 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
bf50: 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
bf60: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
bf70: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
bf80: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b  ->pLeft, pExpr);
bf90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
bfa0: 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
bfb0: 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ty that will be 
bfc0: 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  used to perform 
bfd0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  the .      ** co
bfe0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
bff0: 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
c000: 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  nity of the colu
c010: 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  mn. If.      ** 
c020: 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73  it is not, it is
c030: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
c040: 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a   use any index..
c050: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
c060: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
c070: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58 29  isonAffinity(pX)
c080: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  ;.      int affi
c090: 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d  nity_ok = (pTab-
c0a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
c0b0: 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d  nity==aff||aff==
c0c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
c0d0: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  ;..      for(pId
c0e0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c0f0: 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
c100: 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
c110: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
c120: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
c130: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  (pIdx->aiColumn[
c140: 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20  0]==iCol).      
c150: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e     && sqlite3Fin
c160: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
c170: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
c180: 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a  ll[0], 0)==pReq.
c190: 20 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75           && (!mu
c1a0: 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70  stBeUnique || (p
c1b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
c1c0: 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  && pIdx->onError
c1d0: 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20  !=OE_None)).    
c1e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
c1f0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
c200: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c210: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
c220: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
c230: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
c240: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
c250: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
c260: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
c270: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
c280: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
c290: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c2a0: 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  If, iMem);.     
c2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c2d0: 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a  eger, 1, iMem);.
c2e0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c    .          sql
c2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
c300: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
c310: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
c320: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
c350: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
c360: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
c370: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
c380: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
c390: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
c3a0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
c3b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c3c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c3d0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
c3e0: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
c3f0: 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  nd && !pTab->aCo
c400: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
c410: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
c420: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70  prNotFound = ++p
c430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c450: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c460: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
c470: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  e==0 ){.    /* C
c480: 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61  ould not found a
c490: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
c4a0: 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
c4b0: 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
c4c0: 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
c4d0: 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
c4e0: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
c4f0: 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
c500: 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
c510: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
c520: 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
c530: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
c540: 0a 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f  .    if( prNotFo
c550: 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  und ){.      *pr
c560: 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48  NotFound = rMayH
c570: 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
c580: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65  se->nMem;.    }e
c590: 6c 73 65 20 69 66 28 20 70 58 2d 3e 70 4c 65 66  lse if( pX->pLef
c5a0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  t->iColumn<0 && 
c5b0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
c5c0: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
c5d0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 65  lect) ){.      e
c5e0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
c5f0: 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20  ROWID;.    }.   
c600: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
c610: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
c620: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
c630: 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
c640: 52 4f 57 49 44 29 3b 0a 20 20 7d 65 6c 73 65 7b  ROWID);.  }else{
c650: 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
c660: 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65  = iTab;.  }.  re
c670: 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
c680: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
c690: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
c6a0: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
c6b0: 75 73 65 64 20 61 73 20 61 6e 20 65 78 70 72 65  used as an expre
c6c0: 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20  ssion.** and IN 
c6d0: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
c6e0: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
c6f0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
c700: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
c710: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
c720: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
c730: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
c740: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
c750: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
c770: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
c780: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
c790: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
c7a0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
c7b0: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
c7c0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
c7d0: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
c7e0: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
c7f0: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
c800: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
c810: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
c820: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
c830: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
c840: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
c850: 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
c860: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
c870: 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
c880: 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
c890: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
c8a0: 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
c8b0: 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
c8c0: 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
c8d0: 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
c8e0: 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
c8f0: 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
c900: 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
c910: 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
c920: 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
c930: 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
c940: 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
c950: 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
c960: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
c970: 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
c980: 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
c990: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
c9a0: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
c9b0: 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
c9c0: 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
c9d0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
c9e0: 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
c9f0: 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
ca00: 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
ca10: 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
ca20: 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  ..** Furthermore
ca30: 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e 20 61  , the IN is in a
ca40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
ca50: 64 20 74 68 61 74 20 77 65 20 72 65 61 6c 6c 79  d that we really
ca60: 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72   want.** to iter
ca70: 61 74 65 20 6f 76 65 72 20 74 68 65 20 52 48 53  ate over the RHS
ca80: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ca90: 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tor in order to 
caa0: 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a  quickly locate.*
cab0: 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64  * all correspond
cac0: 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73  ing LHS elements
cad0: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
cae0: 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
caf0: 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65  ialize.** the re
cb00: 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
cb10: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20  rMayHaveNull to 
cb20: 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
cb30: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
cb40: 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63 68 61  e.** care of cha
cb50: 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
cb60: 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  ter value to non
cb70: 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
cb80: 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
cb90: 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
cba0: 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68  Null is zero, th
cbb0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
cbc0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 62 65  e subquery is be
cbd0: 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20  ing used.** for 
cbe0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 69  membership testi
cbf0: 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20  ng only.  There 
cc00: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
cc10: 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20  itialize any.** 
cc20: 72 65 67 69 73 74 65 72 73 20 74 6f 20 69 6e 64  registers to ind
cc30: 69 63 61 74 65 20 74 68 65 20 70 72 65 73 65 6e  icate the presen
cc40: 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20 6f 66  se or absence of
cc50: 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48   NULLs on the RH
cc60: 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53  S..**.** For a S
cc70: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
cc80: 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e  operator, return
cc90: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68   the register th
cca0: 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  at holds the.** 
ccb0: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20  result.  For IN 
ccc0: 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
ccd0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
cce0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
ccf0: 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64  e is 0..*/.#ifnd
cd00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
cd10: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
cd20: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
cd30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cd40: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
cd50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cd60: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cd80: 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f  he IN, SELECT, o
cd90: 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
cda0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48  r */.  int rMayH
cdb0: 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f  aveNull,       /
cdc0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
cdd0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
cde0: 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52  NULLs exist in R
cdf0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  HS */.  int isRo
ce00: 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
ce10: 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20  /* If true, LHS 
ce20: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  of IN operator i
ce30: 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  s a rowid */.){.
ce40: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
ce50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ce60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
ce70: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
ce80: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
ce90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
cec0: 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
ced0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
cee0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
cef0: 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
cf00: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
cf10: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
cf20: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
cf30: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
cf40: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
cf50: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
cf60: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
cf70: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
cf80: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
cf90: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
cfa0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
cfb0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
cfc0: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
cfd0: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
cfe0: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
cff0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
d000: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
d010: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
d020: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
d030: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
d040: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
d050: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
d060: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
d070: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
d080: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
d090: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
d0a0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
d0b0: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
d0c0: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
d0d0: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
d0e0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
d0f0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
d100: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
d110: 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61  rSelect) && !pPa
d120: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
d130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20   ){.    int mem 
d140: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d150: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d160: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
d170: 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73 74  , mem);.    test
d180: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
d190: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d1a0: 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b  nteger, 1, mem);
d1b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73  .    assert( tes
d1c0: 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73  tAddr>0 || pPars
d1d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d1e0: 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77  led );.  }..  sw
d1f0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
d200: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
d210: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
d220: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
d230: 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b  KeyInfo keyInfo;
d240: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
d250: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
d260: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
d270: 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
d280: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
d290: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
d2a0: 3e 70 4c 65 66 74 3b 0a 0a 20 20 20 20 20 20 69  >pLeft;..      i
d2b0: 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
d2c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d2d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d2e0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79  OP_Null, 0, rMay
d2f0: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
d300: 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69   }..      affini
d310: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
d320: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
d330: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
d340: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
d350: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
d360: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
d370: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
d380: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
d390: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
d3a0: 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
d3b0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
d3c0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
d3d0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
d3e0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
d3f0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
d400: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
d410: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
d420: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
d430: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
d440: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
d450: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
d460: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
d470: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
d480: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
d490: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
d4a0: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
d4b0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
d4c0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
d4d0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
d4e0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
d4f0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
d500: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
d510: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
d520: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
d530: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
d540: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
d550: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
d560: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
d570: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
d580: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
d590: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
d5a0: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
d5b0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
d5c0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
d5d0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
d5e0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
d5f0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
d600: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
d610: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
d620: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
d630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d640: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d650: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
d660: 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
d670: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
d680: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
d690: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
d6a0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
d6b0: 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69  ld = 1;..      i
d6c0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
d6d0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
d6e0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
d6f0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
d700: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
d710: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
d720: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
d730: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
d740: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
d750: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
d760: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
d770: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
d780: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
d790: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
d7a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d7b0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
d7c0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
d7d0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
d7e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
d7f0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
d800: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d810: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
d820: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
d830: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
d840: 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28  est.affinity = (
d850: 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  u8)affinity;.   
d860: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
d870: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
d880: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
d890: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
d8a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
d8b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
d8c0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64  r->x.pSelect, &d
d8d0: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
d8e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
d8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
d900: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
d910: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
d920: 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
d930: 41 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26  AYS(pEList!=0 &&
d940: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
d950: 29 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  ) ){ .          
d960: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
d970: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
d980: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
d990: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
d9a0: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
d9b0: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
d9c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
d9d0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
d9e0: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
d9f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
da00: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
da10: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
da20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
da30: 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
da40: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
da50: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
da60: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
da70: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
da80: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
da90: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
daa0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
dab0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
dac0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
dad0: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
dae0: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
daf0: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
db00: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
db10: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
db20: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
db30: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
db40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
db50: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
db60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
db70: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
db80: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
db90: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dba0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
dbb0: 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
dbc0: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
dbd0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
dbe0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
dbf0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
dc00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79     }.        key
dc10: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
dc20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
dc30: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
dc40: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
dc50: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
dc60: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
dc70: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
dc80: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
dc90: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
dca0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
dcb0: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
dcc0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
dcd0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
dce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dcf0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
dd00: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
dd10: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
dd20: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
dd30: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
dd40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
dd50: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
dd60: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
dd70: 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
dd80: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
dd90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
dda0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
ddb0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
ddc0: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
ddd0: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
dde0: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
ddf0: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
de00: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
de10: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
de20: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
de30: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
de40: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
de50: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
de60: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
de70: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
de80: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
de90: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
dea0: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
deb0: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
dec0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
ded0: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
dee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
def0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
df00: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
df10: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
df20: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
df30: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
df40: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
df50: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
df60: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
df70: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
df80: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
df90: 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
dfa0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
dfb0: 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
dfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dfd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
dfe0: 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
dff0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
e000: 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
e010: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e020: 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
e030: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e040: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
e050: 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
e060: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
e070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e090: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
e0a0: 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e0d0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e0e0: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
e0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e100: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
e110: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
e120: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
e130: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
e160: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
e170: 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
e180: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
e190: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e1a0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
e1b0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
e1c0: 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
e1d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e1e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e1f0: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
e200: 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
e210: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e230: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e240: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
e250: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
e260: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
e270: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
e280: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
e290: 20 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77        if( !isRow
e2a0: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  id ){.        sq
e2b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e2c0: 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
e2d0: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)&keyInfo, P4_
e2e0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
e2f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e300: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
e310: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
e320: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
e330: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
e340: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61     /* If this ha
e350: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
e360: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
e370: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
e380: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
e390: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
e3a0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
e3b0: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
e3c0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
e3d0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
e3e0: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20  ell in iColumn. 
e3f0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
e400: 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20  XISTS, write.   
e410: 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
e420: 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
e430: 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e  or 1 (exists) in
e440: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
e450: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
e460: 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79  cord that memory
e470: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
e480: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e490: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f   static const To
e4a0: 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22 2c  ken one = { "1",
e4b0: 20 31 20 7d 3b 20 20 2f 2a 20 54 6f 6b 65 6e 20   1 };  /* Token 
e4c0: 66 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  for literal valu
e4d0: 65 20 31 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  e 1 */.      Sel
e4e0: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
e510: 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
e520: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
e530: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
e560: 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
e570: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
e580: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e590: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
e5a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e5b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
e5c0: 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
e5d0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
e5e0: 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
e5f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
e600: 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
e610: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
e620: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
e630: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
e640: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
e650: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
e660: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
e670: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
e680: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
e690: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
e6a0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
e6b0: 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
e6c0: 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
e6d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e6e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e6f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
e700: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
e710: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e720: 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
e730: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
e740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
e750: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
e760: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
e770: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e780: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e790: 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a  0, dest.iParm);.
e7a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
e7b0: 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
e7c0: 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
e7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
e7e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
e7f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
e800: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
e810: 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
e820: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
e830: 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  rse, TK_INTEGER,
e840: 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20   0, 0, &one);.  
e850: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
e860: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
e870: 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  el, &dest) ){.  
e880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
e890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52        }.      rR
e8a0: 65 67 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  eg = dest.iParm;
e8b0: 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72  .      ExprSetIr
e8c0: 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
e8d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e8e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e8f0: 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20  testAddr ){.    
e900: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e910: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d  ere(v, testAddr-
e920: 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
e930: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
e940: 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74  arse, 1);..  ret
e950: 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
e960: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e970: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
e980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e990: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
e9a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e9b0: 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73  for an IN expres
e9c0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sion..**.**     
e9d0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
e9e0: 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  .).**      x IN 
e9f0: 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
ea00: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ..).**.** The le
ea10: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48  ft-hand side (LH
ea20: 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65  S) is a scalar e
ea30: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20  xpression.  The 
ea40: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
ea50: 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61  (RHS).** is an a
ea60: 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20  rray of zero or 
ea70: 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68  more values.  Th
ea80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ea90: 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  true if the LHS 
eaa0: 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  is.** contained 
eab0: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
eac0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   The value of th
ead0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
eae0: 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a  unknown (NULL).*
eaf0: 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  * if the LHS is 
eb00: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c  NULL or if the L
eb10: 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
eb20: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
eb30: 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48  HS and the.** RH
eb40: 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  S contains one o
eb50: 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
eb60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
eb70: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
eb80: 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20   code will jump 
eb90: 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
eba0: 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
ebb0: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
ebc0: 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
ebd0: 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
ebe0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
ebf0: 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
ec00: 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
ec10: 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
ec20: 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
ec30: 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
ec40: 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
ec50: 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
ec60: 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
ec70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ec80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
ec90: 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
eca0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
ecb0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
ecc0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
ecd0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
ece0: 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
ecf0: 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
ed00: 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
ed10: 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
ed20: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
ed30: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
ed40: 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
ed50: 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
ed60: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
ed70: 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
ed80: 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
ed90: 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
eda0: 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
edb0: 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
edc0: 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
edd0: 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
ede0: 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
edf0: 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69  */.  char affini
ee00: 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ty;        /* Co
ee10: 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74  mparison affinit
ee20: 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y to use */.  in
ee30: 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
ee40: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
ee50: 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
ee60: 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
ee70: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75    /* Temporary u
ee80: 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
ee90: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
eea0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
eeb0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
eec0: 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  uction */..  /* 
eed0: 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e  Compute the RHS.
eee0: 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73 74     After this st
eef0: 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69  ep, the table wi
ef00: 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70  th cursor.  ** p
ef10: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c  Expr->iTable wil
ef20: 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  l contains the v
ef30: 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
ef40: 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  up the RHS..  */
ef50: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
ef60: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
ef70: 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
ef80: 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
ef90: 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
efa0: 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
efb0: 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
efc0: 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
efd0: 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
efe0: 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
eff0: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52 68  rse, pExpr, &rRh
f000: 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a  sHasNull);..  /*
f010: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
f020: 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
f030: 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
f040: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
f050: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70  .  ** of the exp
f060: 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
f070: 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
f080: 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
f090: 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34  able for.  ** P4
f0a0: 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
f0b0: 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69  d..  */.  affini
f0c0: 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ty = comparisonA
f0d0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
f0e0: 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
f0f0: 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
f100: 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
f110: 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71  ...)"..  */.  sq
f120: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
f130: 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31  sh(pParse);.  r1
f140: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f150: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f170: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f180: 4c 65 66 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c  Left, r1);.  sql
f190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f1a0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
f1b0: 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a 0a   destIfNull);...
f1c0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
f1d0: 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
f1e0: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
f1f0: 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
f200: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
f210: 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a  e b-tree.    */.
f220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f230: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
f240: 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49  BeInt, r1, destI
f250: 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c  fFalse);.    sql
f260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f270: 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
f280: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
f290: 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
f2a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f2b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
f2c0: 68 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64  he RHS is an ind
f2d0: 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  ex b-tree..    *
f2e0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
f2f0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
f300: 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30  finity, r1, 1, 0
f310: 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
f320: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
f330: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
f340: 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
f350: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
f360: 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20  e .    ** "x IN 
f370: 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
f380: 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  n must be either
f390: 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74   0 or NULL. If t
f3a0: 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f  he set.    ** co
f3b0: 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
f3c0: 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
f3d0: 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20  result is 0. If 
f3e0: 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20  the set .    ** 
f3f0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
f400: 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
f410: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
f420: 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
f430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
f440: 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  so NULL..    */.
f450: 20 20 20 20 69 66 28 20 72 52 68 73 48 61 73 4e      if( rRhsHasN
f460: 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66  ull==0 || destIf
f470: 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
f480: 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  l ){.      /* Th
f490: 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
f4a0: 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74  f it is known at
f4b0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68   compile time th
f4c0: 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20  at the RHS.     
f4d0: 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61   ** cannot conta
f4e0: 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  in NULL values. 
f4f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20  This happens as 
f500: 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
f510: 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55   ** of a "NOT NU
f520: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  LL" constraint i
f530: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
f540: 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a  chema..      **.
f550: 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75        ** Also ru
f560: 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66  n this branch if
f570: 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c   NULL is equival
f580: 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20  ent to FALSE.   
f590: 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70     ** for this p
f5a0: 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65  articular IN ope
f5b0: 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  rator..      */.
f5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f5d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
f5e0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
f5f0: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
f600: 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a  False, r1, 1);..
f610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f620: 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e   /* In this bran
f630: 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74  ch, the RHS of t
f640: 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74  he IN might cont
f650: 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20  ain a NULL and. 
f660: 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
f670: 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
f680: 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
f690: 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
f6a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74  the.      ** out
f6b0: 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  come..      */. 
f6c0: 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c       int j1, j2,
f6d0: 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   j3;..      /* F
f6e0: 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
f6f0: 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
f700: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
f710: 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20   RHS.  If so,.  
f720: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
f730: 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c  presence of NULL
f740: 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65  s in the RHS doe
f750: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f  s not matter, so
f760: 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f   jump.      ** o
f770: 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
f780: 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ode that follows
f790: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f7a0: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
f7b0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
f7c0: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
f7d0: 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
f7e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65  ;..      /* Here
f7f0: 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61   we begin genera
f800: 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72  ting code that r
f810: 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53 20 69  uns if the LHS i
f820: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  s not.      ** c
f830: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
f840: 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61  the RHS.  Genera
f850: 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  te additional co
f860: 64 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  de that.      **
f870: 20 74 65 73 74 73 20 74 68 65 20 52 48 53 20 66   tests the RHS f
f880: 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68  or NULLs.  If th
f890: 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61  e RHS contains a
f8a0: 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20   NULL then.     
f8b0: 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74   ** jump to dest
f8c0: 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72  IfNull.  If ther
f8d0: 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69  e are no NULLs i
f8e0: 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20  n the RHS then. 
f8f0: 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
f900: 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20  destIfFalse..   
f910: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d     */.      j2 =
f920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f930: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
f940: 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  , rRhsHasNull);.
f950: 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
f960: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
f970: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
f980: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
f990: 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a  RhsHasNull, 1);.
f9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f9c0: 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48  teger, -1, rRhsH
f9d0: 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  asNull);.      s
f9e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f9f0: 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20  re(v, j3);.     
fa00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa10: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
fa20: 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
fa30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fa40: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
fa50: 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  2);..      /* Ju
fa60: 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  mp to the approp
fa70: 72 69 61 74 65 20 74 61 72 67 65 74 20 64 65 70  riate target dep
fa80: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
fa90: 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a  r or not.      *
faa0: 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  * the RHS contai
fab0: 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20  ns a NULL.      
fac0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fad0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fae0: 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  _If, rRhsHasNull
faf0: 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
fb00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fb10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
fb20: 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73  o, 0, destIfFals
fb30: 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  e);..      /* Th
fb40: 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68  e OP_Found at th
fb50: 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72  e top of this br
fb60: 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20  anch jumps here 
fb70: 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20  when true, .    
fb80: 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65    ** causing the
fb90: 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72   overall IN expr
fba0: 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f  ession evaluatio
fbb0: 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67  n to fall throug
fbc0: 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
fbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fbe0: 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
fbf0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
fc00: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
fc10: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
fc20: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
fc30: 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
fc40: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fc50: 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
fc60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fc70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
fc80: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  RY */../*.** Dup
fc90: 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65  licate an 8-byte
fca0: 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
fcb0: 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73   char *dup8bytes
fcc0: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
fcd0: 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61  char *in){.  cha
fce0: 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33  r *out = sqlite3
fcf0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69  DbMallocRaw(sqli
fd00: 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29  te3VdbeDb(v), 8)
fd10: 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
fd20: 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69     memcpy(out, i
fd30: 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74  n, 8);.  }.  ret
fd40: 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e  urn out;.}..#ifn
fd50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd60: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
fd70: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
fd80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
fd90: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
fda0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
fdb0: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
fdc0: 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
fdd0: 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
fde0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
fdf0: 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
fe00: 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
fe10: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
fe20: 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
fe30: 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
fe40: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
fe50: 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
fe60: 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
fe70: 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
fe80: 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
fe90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fea0: 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
feb0: 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
fec0: 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
fed0: 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
fee0: 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
fef0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
ff00: 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lue;.    char *z
ff10: 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  V;.    sqlite3At
ff20: 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  oF(z, &value);. 
ff30: 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
ff40: 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
ff50: 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
ff60: 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
ff70: 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
ff80: 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
ff90: 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
ffa0: 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
ffb0: 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
ffc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ffd0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52  beAddOp4(v, OP_R
ffe0: 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
fff0: 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20   zV, P4_REAL);. 
10000 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
10010 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
10020 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
10030 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
10040 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
10050 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
10060 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
10070 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
10080 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
10090 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
100a0 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
100b0 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
100c0 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
100d0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
100e0 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
100f0 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
10100 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
10110 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
10120 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
10130 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
10140 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
10150 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
10160 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
10170 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76  iMem){.  Vdbe *v
10180 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10190 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
101a0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
101b0 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
101c0 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  = pExpr->u.iValu
101d0 65 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  e;.    if( negFl
101e0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
101f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10200 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10210 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
10220 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
10230 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
10240 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
10250 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
10260 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74    if( sqlite3Fit
10270 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65 67  sIn64Bits(z, neg
10280 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69  Flag) ){.      i
10290 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  64 value;.      
102a0 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20  char *zV;.      
102b0 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c  sqlite3Atoi64(z,
102c0 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   &value);.      
102d0 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76 61  if( negFlag ) va
102e0 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
102f0 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
10300 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
10310 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
10320 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10330 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
10340 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
10350 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
10360 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
10370 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
10380 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
10390 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
103a0 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
103b0 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
103c0 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
103d0 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
103e0 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
103f0 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23  egFlag, iMem);.#
10400 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
10410 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
10420 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
10430 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
10440 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
10450 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
10460 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
10470 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
10480 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
10490 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
104a0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
104b0 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
104c0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
104d0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
104e0 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
104f0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
10500 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
10510 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
10520 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
10530 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
10540 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
10550 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
10560 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
10570 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
10580 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
10590 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
105a0 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
105b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
105c0 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
105d0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
105e0 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
105f0 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
10600 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
10610 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  he *p;..  assert
10620 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20  ( iReg>0 );  /* 
10630 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  Register numbers
10640 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
10650 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
10660 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
10670 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
10680 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
10690 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
106a0 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
106b0 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
106c0 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
106d0 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
106e0 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
106f0 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
10700 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
10710 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
10720 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
10730 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
10740 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
10750 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
10760 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
10770 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6c 75  gs & SQLITE_Colu
10780 6d 6e 43 61 63 68 65 20 29 20 72 65 74 75 72 6e  mnCache ) return
10790 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
107a0 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
107b0 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
107c0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
107d0 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
107e0 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
107f0 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
10800 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
10810 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
10820 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
10830 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
10840 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
10850 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
10860 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
10870 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
10880 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
10890 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
108a0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 23 69 66  ; i++, p++){.#if
108b0 20 30 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20   0 /* This code 
108c0 77 6f 6c 64 20 72 65 6d 6f 76 65 20 74 68 65 20  wold remove the 
108d0 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63  entry from the c
108e0 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
108f0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  ed */.    if( p-
10900 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54 61 62  >iReg && p->iTab
10910 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e 69  le==iTab && p->i
10920 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b 0a  Column==iCol ){.
10930 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
10940 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
10950 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  ;.      p->iLeve
10960 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
10970 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
10980 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
10990 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
109a0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
109b0 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
109c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
109d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
109e0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
109f0 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
10a00 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
10a10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
10a20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
10a30 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
10a40 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
10a50 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
10a60 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
10a70 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
10a80 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
10a90 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
10aa0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
10ab0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
10ac0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
10ad0 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
10ae0 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
10af0 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
10b00 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
10b10 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
10b20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
10b30 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
10b40 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
10b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10b60 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
10b70 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
10b80 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
10b90 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
10ba0 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
10bb0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
10bc0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
10bd0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
10be0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
10bf0 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
10c00 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
10c10 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
10c20 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
10c30 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
10c40 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
10c50 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
10c60 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
10c70 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
10c80 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
10c90 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
10ca0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
10cb0 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
10cc0 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
10cd0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
10ce0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
10cf0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
10d00 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
10d10 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10d20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
10d30 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
10d40 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
10d50 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
10d60 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
10d70 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
10d80 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
10d90 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
10da0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
10db0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10dc0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
10dd0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
10de0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
10df0 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  t i;.  int iLast
10e00 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d   = iReg + nReg -
10e10 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   1;.  struct yCo
10e20 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
10e30 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
10e40 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
10e50 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
10e60 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
10e70 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
10e80 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20      if( r>=iReg 
10e90 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  && r<=iLast ){. 
10ea0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
10eb0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
10ec0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
10ed0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
10ee0 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
10ef0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
10f00 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
10f10 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
10f20 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
10f30 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
10f40 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
10f50 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
10f60 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
10f70 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
10f80 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
10f90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
10fa0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
10fb0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
10fc0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a  CacheLevel++;.}.
10fd0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
10fe0 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
10ff0 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
11000 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
11010 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
11020 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68   previous N Push
11030 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e   operations.  In
11040 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
11050 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a  store the cache.
11060 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ** to the state 
11070 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68  it was in N Push
11080 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  es ago..*/.void 
11090 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
110a0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
110b0 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  e, int N){.  int
110c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
110d0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
110e0 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73  ert( N>0 );.  as
110f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
11100 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a  acheLevel>=N );.
11110 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
11120 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f  Level -= N;.  fo
11130 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11140 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11150 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
11160 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11170 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
11180 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ->iLevel>pParse-
11190 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
111a0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
111b0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
111c0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
111d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
111e0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
111f0 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
11200 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
11210 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
11220 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
11230 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
11240 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
11250 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
11260 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
11270 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
11280 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
11290 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
112a0 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
112b0 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
112c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
112d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
112e0 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
112f0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11300 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
11310 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
11320 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
11330 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11340 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11350 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11360 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
11370 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
11380 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
11390 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
113a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
113b0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
113c0 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
113d0 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
113e0 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
113f0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
11400 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
11410 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65   register.  An e
11420 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65  ffort.** is made
11430 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
11440 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
11450 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74  gister iReg, but
11460 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20   this is.** not 
11470 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65  guaranteed.  The
11480 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
11490 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
114a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
114b0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
114c0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
114d0 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
114e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
114f0 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
11500 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
11510 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
11520 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
11530 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
11540 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11550 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
11560 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11570 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
11580 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
11590 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
115a0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
115b0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
115c0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
115d0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
115e0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
115f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
11600 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
11610 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
11620 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
11630 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
11640 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
11650 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
11660 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
11670 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
11680 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
11690 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
116a0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
116b0 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
116c0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
116d0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
116e0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
116f0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11700 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70  ( p->iReg>0 && p
11710 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
11720 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
11730 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
11740 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
11750 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
11760 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11770 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
11780 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67  (pParse, p->iReg
11790 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
117a0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
117b0 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
117c0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f  !=0 );.  if( iCo
117d0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71  lumn<0 ){.    sq
117e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
117f0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
11800 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65  ble, iReg);.  }e
11810 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
11820 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  Tab!=0) ){.    i
11830 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
11840 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
11850 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
11860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11870 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
11880 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
11890 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
118a0 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
118b0 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  v, pTab, iColumn
118c0 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 73  , iReg);.  }.  s
118d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
118e0 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
118f0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
11900 65 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  eg);.  return iR
11910 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  eg;.}../*.** Cle
11920 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
11930 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
11940 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11950 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
11960 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
11970 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
11980 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
11990 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
119a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
119b0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
119c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
119d0 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20  if( p->iReg ){. 
119e0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
119f0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
11a00 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
11a10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11a20 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
11a30 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
11a40 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
11a50 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
11a60 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
11a70 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
11a80 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
11a90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11aa0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
11ab0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11ac0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
11ad0 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
11ae0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
11af0 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
11b00 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
11b10 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11b20 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
11b30 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
11b40 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
11b50 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
11b60 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
11b70 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
11b80 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
11b90 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
11ba0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
11bb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11bc0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
11bd0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
11be0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
11bf0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69  ColCache *p;.  i
11c00 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d  f( NEVER(iFrom==
11c10 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  iTo) ) return;. 
11c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11c30 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
11c40 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
11c50 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
11c60 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11c70 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11c80 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11c90 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
11ca0 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65    int x = p->iRe
11cb0 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46  g;.    if( x>=iF
11cc0 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e  rom && x<iFrom+n
11cd0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
11ce0 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f  iReg += iTo-iFro
11cf0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  m;.    }.  }.}..
11d00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11d10 6f 64 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74  ode to copy cont
11d20 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
11d30 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
11d40 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
11d50 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
11d60 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  -1..*/.void sqli
11d70 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
11d80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11d90 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
11da0 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
11db0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 4e 45 56  int i;.  if( NEV
11dc0 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29  ER(iFrom==iTo) )
11dd0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
11de0 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29  =0; i<nReg; i++)
11df0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11e00 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
11e10 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
11e20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b  iFrom+i, iTo+i);
11e30 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
11e40 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11e50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
11e60 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
11e70 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
11e80 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
11e90 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
11ea0 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
11eb0 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
11ec0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
11ed0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
11ee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11ef0 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
11f00 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
11f10 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
11f20 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
11f30 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
11f40 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
11f50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
11f60 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
11f70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11f80 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
11f90 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
11fa0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
11fb0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
11fc0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11fd0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11fe0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11ff0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
12000 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
12010 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
12020 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
12030 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
12040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
12050 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12060 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
12070 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
12080 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
12090 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69  e last instructi
120a0 6f 6e 20 63 6f 64 65 64 20 69 73 20 61 6e 20 65  on coded is an e
120b0 70 68 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66  phemeral copy of
120c0 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68 65 20 72   any of.** the r
120d0 65 67 69 73 74 65 72 73 20 69 6e 20 74 68 65 20  egisters in the 
120e0 6e 52 65 67 20 72 65 67 69 73 74 65 72 73 20 62  nReg registers b
120f0 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 69 52  eginning with iR
12100 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76  eg, then.** conv
12110 65 72 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73  ert the last ins
12120 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d 20 4f 50  truction from OP
12130 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f 43 6f 70  _SCopy to OP_Cop
12140 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
12150 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 28 50  e3ExprHardCopy(P
12160 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12170 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
12180 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
12190 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
121a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
121b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
121c0 3d 3d 30 20 29 3b 0a 20 20 76 20 3d 20 70 50 61  ==0 );.  v = pPa
121d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
121e0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
121f0 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
12200 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20  eGetOp(v, -1);. 
12210 20 61 73 73 65 72 74 28 20 70 4f 70 21 3d 30 20   assert( pOp!=0 
12220 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  );.  if( pOp->op
12230 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26  code==OP_SCopy &
12240 26 20 70 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20  & pOp->p1>=iReg 
12250 26 26 20 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b  && pOp->p1<iReg+
12260 6e 52 65 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d  nReg ){.    pOp-
12270 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
12280 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y;.  }.}../*.** 
12290 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
122a0 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
122b0 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74   of the iAlias-t
122c0 68 20 61 6c 69 61 73 20 69 6e 20 72 65 67 69 73  h alias in regis
122d0 74 65 72 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20  ter.** target.  
122e0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
122f0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 70  his is called, p
12300 45 78 70 72 20 69 73 20 65 76 61 6c 75 61 74 65  Expr is evaluate
12310 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  d to compute.** 
12320 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12330 20 61 6c 69 61 73 2e 20 20 54 68 65 20 76 61 6c   alias.  The val
12340 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ue is stored in 
12350 61 6e 20 61 75 78 69 6c 69 61 72 79 20 72 65 67  an auxiliary reg
12360 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65  ister.** and the
12370 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 61 74 20   number of that 
12380 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
12390 72 6e 65 64 2e 20 20 4f 6e 20 73 75 62 73 65 71  rned.  On subseq
123a0 75 65 6e 74 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74  uent calls,.** t
123b0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
123c0 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 77  er is returned w
123d0 69 74 68 6f 75 74 20 67 65 6e 65 72 61 74 69 6e  ithout generatin
123e0 67 20 61 6e 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  g any code..**.*
123f0 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 20 6f  * Note that in o
12400 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 6f  rder for this to
12410 20 77 6f 72 6b 2c 20 63 6f 64 65 20 6d 75 73 74   work, code must
12420 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 69 6e   be generated in
12430 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6f 72 64   the.** same ord
12440 65 72 20 74 68 61 74 20 69 74 20 69 73 20 65 78  er that it is ex
12450 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ecuted..**.** Al
12460 69 61 73 65 73 20 61 72 65 20 6e 75 6d 62 65 72  iases are number
12470 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
12480 20 31 2e 20 20 53 6f 20 69 41 6c 69 61 73 20 69   1.  So iAlias i
12490 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a  s in the range.*
124a0 2a 20 6f 66 20 31 20 74 6f 20 70 50 61 72 73 65  * of 1 to pParse
124b0 2d 3e 6e 41 6c 69 61 73 20 69 6e 63 6c 75 73 69  ->nAlias inclusi
124c0 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72  ve.  .**.** pPar
124d0 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61  se->aAlias[iAlia
124e0 73 2d 31 5d 20 72 65 63 6f 72 64 73 20 74 68 65  s-1] records the
124f0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
12500 20 77 68 65 72 65 20 74 68 65 20 76 61 6c 75 65   where the value
12510 0a 2a 2a 20 6f 66 20 74 68 65 20 69 41 6c 69 61  .** of the iAlia
12520 73 2d 74 68 20 61 6c 69 61 73 20 69 73 20 73 74  s-th alias is st
12530 6f 72 65 64 2e 20 20 49 66 20 7a 65 72 6f 2c 20  ored.  If zero, 
12540 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
12550 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 68 61 73  the.** alias has
12560 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
12570 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
12580 63 20 69 6e 74 20 63 6f 64 65 41 6c 69 61 73 28  c int codeAlias(
12590 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
125a0 6e 74 20 69 41 6c 69 61 73 2c 20 45 78 70 72 20  nt iAlias, Expr 
125b0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
125c0 65 74 29 7b 0a 23 69 66 20 30 0a 20 20 73 71 6c  et){.#if 0.  sql
125d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
125e0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 52 65  e->db;.  int iRe
125f0 67 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  g;.  if( pParse-
12600 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3c 70 50 61  >nAliasAlloc<pPa
12610 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 7b 0a 20  rse->nAlias ){. 
12620 20 20 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61     pParse->aAlia
12630 73 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  s = sqlite3DbRea
12640 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70  llocOrFree(db, p
12650 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 2c 0a 20  Parse->aAlias,. 
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
12690 41 6c 69 61 73 5b 30 5d 29 2a 70 50 61 72 73 65  Alias[0])*pParse
126a0 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20 20 20  ->nAlias );.    
126b0 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61  testcase( db->ma
126c0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70 50  llocFailed && pP
126d0 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f  arse->nAliasAllo
126e0 63 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64  c>0 );.    if( d
126f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12700 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
12710 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
12720 61 41 6c 69 61 73 5b 70 50 61 72 73 65 2d 3e 6e  aAlias[pParse->n
12730 41 6c 69 61 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a  AliasAlloc], 0,.
12740 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 72             (pPar
12750 73 65 2d 3e 6e 41 6c 69 61 73 2d 70 50 61 72 73  se->nAlias-pPars
12760 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 29 2a  e->nAliasAlloc)*
12770 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
12780 41 6c 69 61 73 5b 30 5d 29 29 3b 0a 20 20 20 20  Alias[0]));.    
12790 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c  pParse->nAliasAl
127a0 6c 6f 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41  loc = pParse->nA
127b0 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 61 73 73 65  lias;.  }.  asse
127c0 72 74 28 20 69 41 6c 69 61 73 3e 30 20 26 26 20  rt( iAlias>0 && 
127d0 69 41 6c 69 61 73 3c 3d 70 50 61 72 73 65 2d 3e  iAlias<=pParse->
127e0 6e 41 6c 69 61 73 20 29 3b 0a 20 20 69 52 65 67  nAlias );.  iReg
127f0 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61   = pParse->aAlia
12800 73 5b 69 41 6c 69 61 73 2d 31 5d 3b 0a 20 20 69  s[iAlias-1];.  i
12810 66 28 20 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20  f( iReg==0 ){.  
12820 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 43    if( pParse->iC
12830 61 63 68 65 4c 65 76 65 6c 3e 30 20 29 7b 0a 20  acheLevel>0 ){. 
12840 20 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69       iReg = sqli
12850 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
12860 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
12870 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 65   target);.    }e
12880 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 67 20  lse{.      iReg 
12890 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
128a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
128b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
128c0 70 45 78 70 72 2c 20 69 52 65 67 29 3b 0a 20 20  pExpr, iReg);.  
128d0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 6c 69      pParse->aAli
128e0 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20 3d 20 69  as[iAlias-1] = i
128f0 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
12900 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 23 65   return iReg;.#e
12910 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
12920 41 4d 45 54 45 52 28 69 41 6c 69 61 73 29 3b 0a  AMETER(iAlias);.
12930 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12940 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
12950 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
12960 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rget);.#endif.}.
12970 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12980 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
12990 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
129a0 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
129b0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
129c0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
129d0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
129e0 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
129f0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
12a00 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
12a10 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
12a20 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
12a30 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
12a40 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
12a50 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
12a60 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
12a70 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
12a80 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
12a90 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
12aa0 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
12ab0 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
12ac0 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
12ad0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
12ae0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
12af0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
12b00 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
12b10 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
12b20 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
12b30 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
12b40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
12b50 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
12b60 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
12b70 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
12b80 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
12b90 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
12ba0 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
12bb0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
12bc0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12bd0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
12be0 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
12bf0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
12c00 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
12c10 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
12c20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
12c30 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
12c40 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
12c50 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
12c60 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
12c70 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
12c80 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
12c90 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
12ca0 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
12cb0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
12cc0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
12cd0 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
12ce0 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
12cf0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
12d00 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
12d10 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12d20 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
12d30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
12d40 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
12d50 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
12d60 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
12d70 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
12d80 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12d90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12da0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
12db0 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
12dc0 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
12dd0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
12de0 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
12df0 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
12e00 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
12e10 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
12e20 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
12e30 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
12e40 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
12e50 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
12e60 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
12e70 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
12e80 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
12e90 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
12ea0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
12eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
12ec0 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
12ed0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
12ee0 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  g = pCol->iMem;.
12ef0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12f00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
12f10 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
12f20 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
12f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f40 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
12f50 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
12f60 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
12f90 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  terColumn, targe
12fa0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
12fb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
12fc0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
12fd0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
12fe0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
12ff0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
13000 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
13010 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
13020 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20  >iTable<0 ){.   
13030 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c       /* This onl
13040 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
13050 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73  oding check cons
13060 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
13070 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
13080 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20  e->ckBase>0 );. 
13090 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
130a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20  Expr->iColumn + 
130b0 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a  pParse->ckBase;.
130c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
130d0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
130e0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
130f0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
13100 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
13130 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70  r->iColumn, pExp
13140 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
13150 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
13160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13170 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
13180 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
13190 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
131a0 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
131b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
131c0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
131d0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
131e0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
131f0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
13200 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
13210 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13220 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
13230 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
13240 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
13250 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
13260 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13270 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13280 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
13290 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
132a0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
132b0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
132c0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
132d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
132e0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
132f0 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45  0, target, 0, pE
13300 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
13310 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13320 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13330 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
13340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13350 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
13360 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13370 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13390 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
133a0 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
133b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
133c0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
133d0 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
133e0 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
133f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13400 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13410 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13420 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13430 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
13440 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
13450 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
13460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13470 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
13480 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
13490 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
134a0 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
134b0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
134c0 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
134d0 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
134e0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
134f0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
13500 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
13510 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
13520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13530 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
13540 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
13550 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
13560 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72  NAMIC);.      br
13570 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
13580 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
13590 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
135a0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
135b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
135c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
135d0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
135e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
135f0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13600 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
13610 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
13620 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
13630 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
13640 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 30 0a 20 20  .zToken[1]==0.  
13650 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 20 3d         && (pOp =
13660 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
13670 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64  p(v, -1))->opcod
13680 65 3d 3d 4f 50 5f 56 61 72 69 61 62 6c 65 0a 20  e==OP_Variable. 
13690 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
136a0 70 31 2b 70 4f 70 2d 3e 70 33 3d 3d 70 45 78 70  p1+pOp->p3==pExp
136b0 72 2d 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  r->iColumn.     
136c0 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
136d0 4f 70 2d 3e 70 33 3d 3d 74 61 72 67 65 74 0a 20  Op->p3==target. 
136e0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
136f0 70 34 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 29 7b  p4.z==0.      ){
13700 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
13710 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
13720 72 75 63 74 69 6f 6e 20 77 61 73 20 61 20 63 6f  ruction was a co
13730 70 79 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  py of the previo
13740 75 73 20 75 6e 6e 61 6d 65 64 0a 20 20 20 20 20  us unnamed.     
13750 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
13760 69 6e 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  into the previou
13770 73 20 72 65 67 69 73 74 65 72 2c 20 74 68 65 6e  s register, then
13780 20 73 69 6d 70 6c 79 20 69 6e 63 72 65 6d 65 6e   simply incremen
13790 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
137a0 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20 6f 6e   repeat count on
137b0 20 74 68 65 20 70 72 69 6f 72 20 69 6e 73 74 72   the prior instr
137c0 75 63 74 69 6f 6e 20 72 61 74 68 65 72 20 74 68  uction rather th
137d0 61 6e 20 6d 61 6b 69 6e 67 20 61 20 6e 65 77 0a  an making a new.
137e0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72          ** instr
137f0 75 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uction..        
13800 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
13810 70 33 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  p3++;.      }els
13820 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
13830 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13840 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
13850 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
13860 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
13870 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54   if( pExpr->u.zT
13880 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20  oken[1]!=0 ){.  
13890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
138a0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
138b0 31 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  1, pExpr->u.zTok
138c0 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  en, 0);.        
138d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
138e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
138f0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
13900 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
13910 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
13920 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13930 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13940 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
13950 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70  eg = codeAlias(p
13960 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 69 54  Parse, pExpr->iT
13970 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  able, pExpr->pLe
13980 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
13990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
139a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
139b0 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
139c0 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
139d0 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
139e0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
139f0 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
13a00 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
13a10 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20  nt aff, to_op;. 
13a20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
13a30 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
13a40 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
13a50 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
13a60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13a70 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13a80 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
13a90 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66  lue) );.      af
13aa0 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
13ab0 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
13ac0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
13ad0 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
13ae0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
13af0 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
13b00 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
13b10 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
13b20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
13b30 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
13b40 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
13b50 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
13b60 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
13b70 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
13b80 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
13b90 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
13ba0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
13bb0 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
13bc0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
13bd0 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
13be0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
13bf0 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
13c00 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
13c10 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
13c20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
13c30 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
13c40 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
13c50 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20  ==OP_ToText );. 
13c60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
13c70 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
13c80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13c90 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  e( to_op==OP_ToN
13ca0 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20  umeric );.      
13cb0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
13cc0 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20  =OP_ToInt );.   
13cd0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
13ce0 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b  op==OP_ToReal );
13cf0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
13d00 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
13d10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13d20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
13d30 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
13d40 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
13d50 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
13d60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13d70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f  VdbeAddOp1(v, to
13d80 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  _op, inReg);.   
13d90 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65     testcase( use
13da0 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
13db0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e  Parse, inReg, in
13dc0 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71  Reg) );.      sq
13dd0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
13de0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
13df0 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a  rse, inReg, 1);.
13e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13e10 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
13e20 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
13e30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
13e40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
13e50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
13e60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
13e70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
13e80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
13e90 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
13ea0 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
13eb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
13ec0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
13ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13ee0 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
13ef0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
13f00 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
13f10 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
13f20 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
13f30 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
13f40 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
13f50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
13f60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13f70 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
13f80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13f90 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
13fa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13fb0 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
13fc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13fd0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
13fe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
13ff0 45 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  E );.      r1 = 
14000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14010 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14020 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14030 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
14040 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14050 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14060 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
14070 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
14080 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
14090 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
140a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
140b0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
140c0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
140d0 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
140e0 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  P2);.      testc
140f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14100 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14110 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
14120 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14130 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14140 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
14150 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
14160 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14170 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
14180 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
14190 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
141a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
141b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
141c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
141d0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
141e0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
141f0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14200 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
14210 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
14220 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
14230 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
14240 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
14250 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
14260 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
14270 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
142a0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
142b0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
142c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
142d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
142e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
142f0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
14300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
14320 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
14330 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
14340 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
14350 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
14360 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
14370 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
14380 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
14390 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
143a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
143b0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
143c0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
143d0 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
143e0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
143f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14400 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
14410 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14420 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
14430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14440 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
14450 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14460 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
14470 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61  tract );.      a
14480 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
14490 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20  P_Remainder );. 
144a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
144b0 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
144c0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
144d0 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
144e0 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  BitOr );.      a
144f0 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
14500 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20  =OP_Divide );.  
14510 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14520 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
14530 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eft );.      ass
14540 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
14550 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
14560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14570 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
14580 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  cat );.      tes
14590 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
145a0 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
145b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
145c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
145d0 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
145e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
145f0 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
14600 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14610 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
14620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14630 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
14640 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14650 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
14660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14670 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
14680 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14690 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
146a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
146b0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
146c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
146d0 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
146e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
146f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14700 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14710 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
14720 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
14730 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14740 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14750 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
14760 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
14770 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14780 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
14790 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
147a0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
147b0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
147c0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
147d0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
147e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
147f0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
14800 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
14810 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
14820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
14830 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
14840 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
14850 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
14860 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
14870 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
14880 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20  arget);.#ifndef 
14890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
148a0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
148b0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
148c0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
148d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
148e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
148f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
14900 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
14910 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
14920 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
14930 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
14940 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
14950 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
14960 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  = r1 = sqlite3Ge
14970 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
14980 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14990 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
149a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31  P_Integer, 0, r1
149b0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
149c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
149d0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
149e0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
149f0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
14a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14a10 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
14a20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
14a30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14a40 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
14a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14a60 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
14a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14a80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
14a90 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
14aa0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
14ab0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
14ac0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a  T==OP_BitNot );.
14ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14ae0 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a  _NOT==OP_Not );.
14af0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14b00 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
14b10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14b20 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
14b30 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14b40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14b50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14b60 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
14b70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14b80 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14b90 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
14ba0 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  get;.      sqlit
14bb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14bc0 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
14bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14be0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
14bf0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
14c00 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
14c10 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
14c20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
14c30 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
14c40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14c50 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
14c60 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
14c70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14c80 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
14c90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14ca0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
14cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14cd0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
14ce0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14cf0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14d00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14d10 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14d20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d30 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
14d40 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
14d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14d60 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20  (v, op, r1);.   
14d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d80 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
14d90 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a  m, target, -1);.
14da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14db0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14dc0 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
14dd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14de0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
14df0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
14e00 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
14e10 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
14e20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
14e30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14e40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14e50 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14e60 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
14e70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14e80 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
14e90 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
14ea0 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
14eb0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
14ec0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
14ed0 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
14ee0 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
14ef0 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
14f00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14f10 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
14f20 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
14f30 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
14f40 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
14f50 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
14f60 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
14f70 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
14f80 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
14f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14fa0 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
14fb0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
14fc0 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
14fd0 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
14fe0 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
14ff0 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
15000 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15020 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75  Length of the fu
15030 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62  nction name in b
15040 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ytes */.      co
15050 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
15060 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
15070 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
15080 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b     int constMask
15090 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73   = 0;     /* Mas
150a0 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  k of function ar
150b0 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  guments that are
150c0 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20   constant */.   
150d0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
150e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
150f0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15100 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
15110 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
15120 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
15130 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
15140 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
15150 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
15160 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
15170 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
15180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
15190 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
151a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
151b0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65  ect) );.      te
151c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
151d0 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20  ONST_FUNC );.   
151e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
151f0 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  =TK_FUNCTION );.
15200 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
15210 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
15220 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
15230 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
15240 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
15250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
15260 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
15270 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
15280 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
15290 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
152a0 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
152b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
152c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
152d0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
152e0 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
152f0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
15300 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
15310 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
15320 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
15330 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
15340 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20  Id, nId, nFarg, 
15350 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
15360 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
15370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15380 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
15390 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
153a0 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a   %.*s()", nId, z
153b0 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
153c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
153d0 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
153e0 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
153f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
15400 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
15410 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
15420 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
15430 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
15440 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61  nnecessary evala
15450 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
15460 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
15470 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
15480 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
15490 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
154a0 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
154b0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
154c0 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
154d0 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
154e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
154f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
15500 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
15510 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
15520 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
15530 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
15540 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
15550 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
15560 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
15570 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15580 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15590 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
155a0 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
155b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
155c0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
155d0 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  ve(pParse, targe
155e0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 1);.         
155f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15600 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
15610 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15620 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
15630 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
15640 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
15650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15660 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
15670 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 1);.        }
15680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15690 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
156a0 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
156b0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
156c0 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
156d0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
156e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
156f0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
15700 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
15710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15720 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
15730 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
15740 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
15750 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
15760 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
15770 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
15780 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
15790 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
157a0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
157b0 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65  ;   /* Ticket 2e
157c0 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
157d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
157e0 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
157f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15800 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15810 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
15820 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
15830 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
15840 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15850 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
15860 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
15870 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
15880 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
15890 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
158a0 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
158b0 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
158c0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
158d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
158e0 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
158f0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
15900 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
15910 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
15920 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
15930 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
15940 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
15950 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
15960 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
15970 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
15980 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
15990 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
159a0 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
159b0 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
159c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
159d0 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
159e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
159f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
15a00 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
15a10 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
15a20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
15a30 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
15a40 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
15a50 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
15a60 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
15a70 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
15a80 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
15a90 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
15aa0 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
15ab0 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
15ac0 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
15ad0 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
15ae0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
15af0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
15b00 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
15b10 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
15b20 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
15b30 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
15b40 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
15b50 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
15b60 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
15b70 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
15b80 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
15b90 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
15ba0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
15bb0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15bc0 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
15bd0 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
15be0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
15bf0 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
15c00 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
15c10 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
15c20 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
15c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
15c40 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  ( (pDef->flags &
15c50 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
15c60 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
15c70 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
15c80 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
15c90 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
15ca0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
15cb0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
15cc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15cd0 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20  if( pDef->flags 
15ce0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
15cf0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
15d00 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
15d10 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
15d20 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
15d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15d40 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
15d50 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
15d60 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
15d70 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
15d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d90 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
15da0 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
15db0 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
15de0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
15df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15e00 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
15e10 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  Farg);.      if(
15e20 20 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   nFarg ){.      
15e30 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15e40 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
15e50 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
15e60 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
15e70 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
15e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15e90 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
15ea0 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
15eb0 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
15ec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15ed0 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
15ee0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15ef0 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
15f00 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
15f10 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
15f20 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
15f30 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
15f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15f50 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
15f60 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
15f70 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
15f80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15f90 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
15fa0 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
15fb0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
15fe0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
15ff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16000 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
16010 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
16020 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
16030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16050 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
16060 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
16070 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16080 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
16090 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
160a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
160b0 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
160c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
160d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
160e0 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
160f0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
16100 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
16110 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16120 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
16130 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
16140 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
16150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
16160 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
16170 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
16180 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
16190 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
161a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
161b0 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
161c0 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
161d0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
161e0 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
161f0 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
16200 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
16210 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
16220 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
16230 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
16240 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
16250 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
16260 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16270 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
16280 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
16290 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
162a0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
162b0 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72  >pExpr;..      r
162c0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
162d0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
162e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
162f0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
16300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16310 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
16320 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
16330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16340 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
16350 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16360 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
16370 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65    r3 = sqlite3Ge
16380 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16390 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c  ;.      r4 = sql
163a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
163b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f  Parse);.      co
163c0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
163d0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
163e0 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20   OP_Ge,.        
163f0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
16400 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r3, SQLITE_STO
16410 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49  REP2);.      pLI
16420 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
16430 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
16440 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
16450 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16460 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
16470 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
16480 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16490 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
164a0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
164b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
164c0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
164d0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
164e0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
164f0 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
16500 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
16510 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
16520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16530 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33  p3(v, OP_And, r3
16540 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r4, target);. 
16550 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16560 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16570 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71  e, r3);.      sq
16580 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16590 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b  Reg(pParse, r4);
165a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
165b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
165c0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
165d0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
165e0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
165f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16600 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
16610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16620 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
16630 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
16640 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
16650 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
16660 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
16670 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
16680 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
16690 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
166a0 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
166b0 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
166c0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
166d0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
166e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
166f0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
16700 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
16710 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
16720 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
16730 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
16740 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
16750 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
16760 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
16770 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
16780 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
16790 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
167a0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
167b0 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
167c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
167d0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
167e0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
167f0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
16800 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
16810 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
16820 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
16830 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
16840 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
16850 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
16860 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
16870 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
16880 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
16890 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
168a0 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
168b0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
168c0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
168d0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
168e0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
168f0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
16900 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
16910 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
16920 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
16930 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
16940 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
16950 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
16960 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
16970 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
16980 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
16990 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
169a0 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
169b0 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
169c0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
169d0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
169e0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
169f0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
16a00 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
16a10 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
16a20 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
16a30 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
16a40 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
16a50 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
16a60 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
16a70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
16a80 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
16a90 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
16aa0 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
16ab0 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
16ac0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
16ad0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
16ae0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
16af0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
16b00 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
16b10 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
16b20 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
16b30 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
16b40 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
16b50 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
16b60 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
16b70 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
16b80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
16b90 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
16ba0 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
16bb0 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
16bc0 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
16bd0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
16be0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
16bf0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16c00 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
16c10 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
16c20 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
16c30 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
16c40 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
16c50 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
16c60 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
16c70 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
16c80 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
16c90 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
16ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16cb0 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
16cc0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
16cd0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16ce0 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
16cf0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
16d00 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
16d10 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
16d20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
16d30 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
16d40 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
16d50 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
16d60 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
16d70 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
16d80 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
16d90 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
16da0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
16db0 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
16dc0 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
16dd0 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
16de0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
16df0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
16e00 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
16e10 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
16e20 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
16e30 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20  ly real.  */.   
16e40 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
16e50 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
16e60 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
16e70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
16e80 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
16e90 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
16ea0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16eb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16ec0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
16ed0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
16ee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
16ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
16f00 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
16f10 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
16f20 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
16f30 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
16f40 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
16f50 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
16f60 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
16f70 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
16f80 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
16f90 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
16fa0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
16fb0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
16fc0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
16fd0 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
16fe0 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
16ff0 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
17000 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
17010 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
17020 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
17030 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
17040 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
17050 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
17060 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
17070 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
17080 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
17090 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
170a0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
170b0 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d  * Y is in pExpr-
170c0 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20  >pRight.  The Y 
170d0 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
170e0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
170f0 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c  o.    ** ELSE cl
17100 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ause and no othe
17110 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20  r term matches, 
17120 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
17130 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78  of the.    ** ex
17140 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e  prssion is NULL.
17150 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
17160 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
17170 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
17180 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
17190 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
171a0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
171b0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
171c0 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
171d0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
171e0 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
171f0 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
17200 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
17210 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
17220 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
17230 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
17240 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
17250 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
17260 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
17270 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
17280 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
172a0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
172b0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
172c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
172d0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
172e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
172f0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
17300 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
17310 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
17320 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
17330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
17340 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
17350 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
17360 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
17390 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
173a0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
173b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
173c0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
173d0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
173e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
173f0 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
17400 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
17410 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
17420 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17440 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
17450 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
17460 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20  xpr cacheX;     
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65   /* Cached expre
17490 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20  ssion X */.     
174a0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
174d0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
174e0 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
17510 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
17520 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
17530 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
17540 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
17550 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
17560 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
17570 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
17580 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17590 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
175a0 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
175b0 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
175c0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
175d0 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
175e0 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
175f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
17600 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
17610 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
17620 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
17630 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
17640 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
17650 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
17660 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
17670 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17680 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
17690 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
176a0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
176b0 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a        cacheX = *
176c0 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
176d0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
176e0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
176f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
17700 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
17710 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
17720 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
17730 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17740 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
17750 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
17760 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17770 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
17780 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f   cacheX.op = TK_
17790 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
177a0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
177b0 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
177c0 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
177d0 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
177e0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
177f0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  mpare;.      }. 
17800 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17810 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
17820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17830 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
17840 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
17850 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
17860 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
17870 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
17880 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
17890 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
178a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
178b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
178c0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
178d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
178e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
178f0 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
17900 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17910 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17920 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
17930 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
17940 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
17950 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
17960 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
17970 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
17980 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17990 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
179a0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
179b0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
179c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
179d0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
179e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
179f0 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
17a00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17a10 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
17a20 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
17a30 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
17a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17a50 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
17a60 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
17a70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17a80 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
17a90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17aa0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17ab0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
17ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17ad0 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
17ae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17af0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17b00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17b10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17b20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17b30 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
17b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17b50 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
17b60 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  rse, 1);.      }
17b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
17b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17b90 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
17ba0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
17bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17bc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
17bd0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
17be0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
17bf0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
17c00 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
17c10 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17c20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17c30 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
17c40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17c50 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
17c60 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
17c70 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
17c80 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17c90 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
17ca0 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
17cb0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
17cc0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17cd0 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
17ce0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
17cf0 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
17d00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
17d10 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
17d20 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
17d30 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
17d40 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
17d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17d60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17d70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
17d80 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
17d90 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
17da0 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
17db0 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
17dc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
17dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17de0 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
17df0 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
17e00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17e10 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
17e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17e30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
17e40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17e50 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
17e60 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17e70 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
17e80 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
17e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17ea0 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
17eb0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
17ec0 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
17ed0 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
17ee0 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  ken,0);.      }e
17ef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
17f00 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
17f10 6e 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  nt(pParse, pExpr
17f20 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70  ->affinity, pExp
17f30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
17f40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17f50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
17f60 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
17f70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17f80 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
17f90 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
17fa0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17fb0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
17fc0 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
17fd0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
17fe0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
17ff0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
18000 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
18010 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
18020 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
18030 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
18040 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
18050 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
18060 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
18070 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
18080 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
18090 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
180a0 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
180b0 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
180c0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
180d0 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
180e0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
180f0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
18100 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
18110 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  to zero..*/.int 
18120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
18130 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
18140 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
18150 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
18160 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
18170 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
18180 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c  ;.  int r2 = sql
18190 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
181a0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
181b0 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d  , r1);.  if( r2=
181c0 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  =r1 ){.    *pReg
181d0 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = r1;.  }else{.
181e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
181f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18200 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67  , r1);.    *pReg
18210 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
18220 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
18230 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
18240 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
18250 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
18260 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
18270 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
18280 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
18290 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
182a0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
182b0 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
182c0 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69  ter target..*/.i
182d0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
182e0 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
182f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
18300 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
18310 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
18320 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
18330 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
18340 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52 65 67 20  nMem );.  inReg 
18350 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18360 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
18370 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18380 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
18390 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73  ->pVdbe || pPars
183a0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
183b0 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 52  led );.  if( inR
183c0 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
183d0 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
183e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
183f0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
18400 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
18410 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
18420 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67 65  }.  return targe
18430 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
18440 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
18450 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65  valutes the give
18460 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
18470 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
18480 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
18490 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
184a0 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
184b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
184c0 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
184d0 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
184e0 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
184f0 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
18500 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
18510 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
18520 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
18530 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
18540 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
18550 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
18560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
18570 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
18580 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
18590 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
185a0 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
185b0 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
185c0 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
185d0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
185e0 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
185f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
18600 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
18610 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
18620 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
18630 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
18640 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18650 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  be;.  int inReg;
18660 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  .  inReg = sqlit
18670 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
18680 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
18690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
186a0 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68  get>0 );.  /* Th
186b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
186c0 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d 73 20 74  lled for terms t
186d0 6f 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  o INSERT or UPDA
186e0 54 45 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c  TE.  And the onl
186f0 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61  y.  ** other pla
18700 63 65 20 77 68 65 72 65 20 65 78 70 72 65 73 73  ce where express
18710 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e 76  ions can be conv
18720 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45  erted into TK_RE
18730 47 49 53 54 45 52 20 69 73 0a 20 20 2a 2a 20 69  GISTER is.  ** i
18740 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  n WHERE clause p
18750 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f 20 61  rocessing.  So a
18760 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c  s currently impl
18770 65 6d 65 6e 74 65 64 2c 20 74 68 65 72 65 20 69  emented, there i
18780 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f  s.  ** no way fo
18790 72 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20  r a TK_REGISTER 
187a0 74 6f 20 65 78 69 73 74 20 68 65 72 65 2e 20 20  to exist here.  
187b0 42 75 74 20 69 74 20 73 65 65 6d 73 20 70 72 75  But it seems pru
187c0 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  dent to.  ** kee
187d0 70 20 74 68 65 20 41 4c 57 41 59 53 28 29 20 69  p the ALWAYS() i
187e0 6e 20 63 61 73 65 20 74 68 65 20 63 6f 6e 64 69  n case the condi
187f0 74 69 6f 6e 73 20 61 62 6f 76 65 20 63 68 61 6e  tions above chan
18800 67 65 20 77 69 74 68 20 66 75 74 75 72 65 0a 20  ge with future. 
18810 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
18820 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74  s or enhancement
18830 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  s. */.  if( ALWA
18840 59 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  YS(pExpr->op!=TK
18850 5f 52 45 47 49 53 54 45 52 29 20 29 7b 20 20 0a  _REGISTER) ){  .
18860 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20      int iMem;.  
18870 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
18880 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
18890 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
188a0 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67  , OP_Copy, inReg
188b0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78  , iMem);.    pEx
188c0 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65  pr->iTable = iMe
188d0 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  m;.    pExpr->op
188e0 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  2 = pExpr->op;. 
188f0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
18900 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a  K_REGISTER;.  }.
18910 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
18920 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18930 54 52 55 45 20 69 66 20 70 45 78 70 72 20 69 73  TRUE if pExpr is
18940 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65 78 70   an constant exp
18950 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
18960 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66  appropriate.** f
18970 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74  or factoring out
18980 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70   of a loop.  App
18990 72 6f 70 72 69 61 74 65 20 65 78 70 72 65 73 73  ropriate express
189a0 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ions are:.**.** 
189b0 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72 65 73     *  Any expres
189c0 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c 75 61  sion that evalua
189d0 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f  tes to two or mo
189e0 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a  re opcodes..**.*
189f0 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49  *    *  Any OP_I
18a00 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c  nteger, OP_Real,
18a10 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42   OP_String, OP_B
18a20 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a  lob, OP_Null, .*
18a30 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f 56 61  *       or OP_Va
18a40 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73  riable that does
18a50 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
18a60 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20  placed in a .** 
18a70 20 20 20 20 20 20 73 70 65 63 69 66 69 63 20 72        specific r
18a80 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
18a90 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
18aa0 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20 6f 75   in factoring ou
18ab0 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  t single-instruc
18ac0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  tion constant.**
18ad0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
18ae0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61  t need to be pla
18af0 63 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  ced in a particu
18b00 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20 20 0a  lar register.  .
18b10 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61 63 74  ** We could fact
18b20 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62 75 74  or them out, but
18b30 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64 20 65   then we would e
18b40 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61 6e 0a  nd up adding an.
18b50 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74  ** OP_SCopy inst
18b60 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ruction to move 
18b70 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
18b80 68 65 20 63 6f 72 72 65 63 74 20 72 65 67 69 73  he correct regis
18b90 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57  ter.** later.  W
18ba0 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20  e might as well 
18bb0 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f 72 69  just use the ori
18bc0 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  ginal instructio
18bd0 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74  n and.** avoid t
18be0 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a  he OP_SCopy..*/.
18bf0 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 70 70  static int isApp
18c00 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
18c10 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b 0a 20  ring(Expr *p){. 
18c20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
18c30 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
18c40 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74  in(p) ){.    ret
18c50 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20  urn 0;  /* Only 
18c60 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
18c70 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f 70 72  ions are appropr
18c80 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f 72 69  iate for factori
18c90 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
18ca0 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  (p->flags & EP_F
18cb0 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a  ixedDest)==0 ){.
18cc0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
18cd0 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77  * Any constant w
18ce0 69 74 68 6f 75 74 20 61 20 66 69 78 65 64 20 64  ithout a fixed d
18cf0 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 70  estination is ap
18d00 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d  propriate */.  }
18d10 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
18d20 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20 3d 20  =TK_UPLUS ) p = 
18d30 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77 69 74  p->pLeft;.  swit
18d40 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66  ch( p->op ){.#if
18d50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18d60 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
18d70 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
18d80 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
18d90 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
18da0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
18db0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
18dc0 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
18dd0 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  _NULL:.    case 
18de0 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
18df0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
18e00 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20  op==TK_BLOB );. 
18e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18e20 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
18e30 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
18e40 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ase( p->op==TK_I
18e50 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
18e60 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
18e70 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20  =TK_FLOAT );.   
18e80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
18e90 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20  op==TK_NULL );. 
18ea0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18eb0 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
18ec0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 67  );.      /* Sing
18ed0 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  le-instruction c
18ee0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 61 20  onstants with a 
18ef0 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
18f00 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 62  n are.      ** b
18f10 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69  etter done in-li
18f20 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63 74 6f  ne.  If we facto
18f30 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77 69 6c  r them, they wil
18f40 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20 20 20  l just end.     
18f50 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74 69 6e   ** up generatin
18f60 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f  g an OP_SCopy to
18f70 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
18f80 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  to the destinati
18f90 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 69  on.      ** regi
18fa0 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72  ster. */.      r
18fb0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
18fc0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
18fd0 53 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  S: {.      if( p
18fe0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
18ff0 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c 65 66  FLOAT || p->pLef
19000 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
19010 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  R ){.        ret
19020 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
19030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19040 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
19050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19060 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19070 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   1;.}../*.** If 
19080 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
19090 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ant expression t
190a0 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
190b0 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72  te for.** factor
190c0 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  ing out of a loo
190d0 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  p, then evaluate
190e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
190f0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
19100 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
19110 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  he expression in
19120 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
19130 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
19140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76  */.static int ev
19150 61 6c 43 6f 6e 73 74 45 78 70 72 28 57 61 6c 6b  alConstExpr(Walk
19160 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
19170 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 50 61 72  r *pExpr){.  Par
19180 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
19190 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
191a0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
191b0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
191c0 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IN:.    case TK
191d0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
191e0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
191f0 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
19200 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
19210 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
19220 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
19230 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
19240 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  C: {.      /* Th
19250 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  e arguments to a
19260 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61   function have a
19270 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
19280 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72  on..      ** Mar
19290 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61 79 20  k them this way 
192a0 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74  to avoid generat
192b0 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53  ed unneeded OP_S
192c0 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  Copy.      ** in
192d0 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20  structions. .   
192e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
192f0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
19300 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
19310 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
19320 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
19330 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
19340 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
19350 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
19360 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
19370 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 73 74  Expr;.        st
19380 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19390 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73  em *pItem = pLis
193a0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
193b0 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  r(; i>0; i--, pI
193c0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
193d0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 74    if( ALWAYS(pIt
193e0 65 6d 2d 3e 70 45 78 70 72 29 20 29 20 70 49 74  em->pExpr) ) pIt
193f0 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73  em->pExpr->flags
19400 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74   |= EP_FixedDest
19410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19420 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
19430 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
19440 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
19450 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72  rFactoring(pExpr
19460 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  ) ){.    int r1 
19470 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19480 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20  ;.    int r2;.  
19490 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
194a0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
194b0 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
194c0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72  .    if( NEVER(r
194d0 31 21 3d 72 32 29 20 29 20 73 71 6c 69 74 65 33  1!=r2) ) sqlite3
194e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
194f0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
19500 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78  pExpr->op2 = pEx
19510 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70  pr->op;.    pExp
19520 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
19530 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  TER;.    pExpr->
19540 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20  iTable = r2;.   
19550 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
19560 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
19570 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
19580 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61  ./*.** Preevalua
19590 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  te constant sube
195a0 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74 68 69  xpressions withi
195b0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
195c0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
195d0 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e 20 20   in registers.  
195e0 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73 6f 20  Modify pExpr so 
195f0 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
19600 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e 73 0a  t subexpresions.
19610 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49 53 54  ** are TK_REGIST
19620 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20  ER opcodes that 
19630 72 65 66 65 72 20 74 6f 20 74 68 65 20 70 72 65  refer to the pre
19640 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 73 2e  computed values.
19650 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19660 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
19670 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
19680 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
19690 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
196a0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
196b0 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  valConstExpr;.  
196c0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
196d0 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73  k = 0;.  w.pPars
196e0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
196f0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
19700 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a  , pExpr);.}.../*
19710 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19720 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
19730 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
19740 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
19750 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
19760 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
19770 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
19780 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
19790 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
197a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
197b0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
197c0 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  valuated..*/.int
197d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
197e0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
197f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
19800 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
19810 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
19820 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
19830 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
19840 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
19850 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
19860 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
19870 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
19880 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f  /.  int doHardCo
19890 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61  py     /* Make a
198a0 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65 76   hard copy of ev
198b0 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29  ery element */.)
198c0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
198d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
198e0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
198f0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
19900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
19910 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70  get>0 );.  n = p
19920 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
19930 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
19940 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
19950 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19960 69 66 28 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61  if( pItem->iAlia
19970 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  s ){.      int i
19980 52 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28  Reg = codeAlias(
19990 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 69  pParse, pItem->i
199a0 41 6c 69 61 73 2c 20 70 49 74 65 6d 2d 3e 70 45  Alias, pItem->pE
199b0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
199c0 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
199d0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
199e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
199f0 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 2b 69  ( iReg!=target+i
19a00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19a10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19a20 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c   OP_SCopy, iReg,
19a30 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
19a40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
19a50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19a60 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
19a70 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65  em->pExpr, targe
19a80 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t+i);.    }.    
19a90 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79 20 26  if( doHardCopy &
19aa0 26 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  & !pParse->db->m
19ab0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
19ac0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19ad0 48 61 72 64 43 6f 70 79 28 70 50 61 72 73 65 2c  HardCopy(pParse,
19ae0 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a 20 20 20   target, n);.   
19af0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19b00 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
19b10 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
19b20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
19b30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
19b40 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
19b50 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
19b60 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
19b70 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
19b80 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
19b90 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
19ba0 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
19bb0 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
19bc0 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65  ression.** eleme
19bd0 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f  ntation of x..*/
19be0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
19bf0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20  rCodeBetween(.  
19c00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19c10 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
19c20 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
19c30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
19c40 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
19c50 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65  /* The BETWEEN e
19c60 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
19c70 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
19c80 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19c90 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
19ca0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  en */.  int jump
19cb0 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b  IfTrue,   /* Tak
19cc0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
19cd0 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75  e BETWEEN is tru
19ce0 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
19cf0 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
19d00 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
19d10 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
19d20 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78   */.){.  Expr ex
19d30 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
19d40 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
19d50 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
19d60 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
19d70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
19d80 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
19d90 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
19da0 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
19db0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
19dc0 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
19dd0 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
19de0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
19df0 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
19e00 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
19e10 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  gister */..  ass
19e20 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
19e30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
19e40 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
19e50 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
19e60 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
19e70 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
19e80 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
19e90 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
19ea0 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
19eb0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
19ec0 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
19ed0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
19ee0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
19ef0 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
19f00 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
19f10 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
19f20 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
19f30 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
19f40 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
19f50 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
19f60 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
19f70 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
19f80 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20  .  exprX.iTable 
19f90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19fa0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
19fb0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
19fc0 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54  ;.  exprX.op = T
19fd0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 69 66  K_REGISTER;.  if
19fe0 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a  ( jumpIfTrue ){.
19ff0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a000 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
1a010 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1a020 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
1a030 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1a040 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1a050 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1a060 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1a070 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1a080 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a090 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a  se, regFree1);..
1a0a0 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71    /* Ensure adeq
1a0b0 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61  uate test covera
1a0c0 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ge */.  testcase
1a0d0 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1a0e0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1a0f0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1a100 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1a110 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1a120 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1a130 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1a140 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a150 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1a160 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1a170 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1a180 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a190 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1a1a0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1a1b0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1a1c0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a1d0 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1a1e0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1a1f0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1a200 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1a210 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1a220 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1a230 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a240 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1a250 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1a260 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1a270 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1a280 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1a290 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1a2a0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a  egFree1!=0 );.}.
1a2b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a2c0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1a2d0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1a2e0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1a2f0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1a300 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1a310 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a320 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
1a330 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
1a340 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
1a350 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1a360 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
1a370 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1a380 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1a390 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1a3a0 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
1a3b0 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
1a3c0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
1a3d0 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
1a3e0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1a3f0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
1a400 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1a410 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
1a420 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
1a430 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
1a440 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
1a450 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
1a460 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
1a470 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
1a480 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
1a490 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
1a4a0 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
1a4b0 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
1a4c0 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
1a4d0 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
1a4e0 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
1a4f0 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
1a500 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
1a510 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
1a520 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
1a530 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
1a540 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
1a550 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
1a560 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1a570 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a580 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1a590 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
1a5a0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
1a5b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1a5c0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
1a5d0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1a5e0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1a5f0 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
1a600 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
1a610 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
1a620 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
1a630 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
1a640 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
1a650 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72  ==0) )     retur
1a660 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63 65  n;  /* Existance
1a670 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
1a680 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
1a690 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
1a6a0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
1a6b0 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61  * No way this ca
1a6c0 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70  n happen */.  op
1a6d0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1a6e0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1a6f0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1a700 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1a710 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a720 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1a730 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1a740 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1a750 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a760 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1a770 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a780 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1a790 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
1a7a0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1a7b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1a7c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a7d0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1a7e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1a7f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1a800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a810 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a820 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
1a830 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1a840 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
1a850 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a860 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1a870 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1a880 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1a890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a8a0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1a8b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1a8c0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1a8d0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1a8e0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1a8f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1a900 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1a910 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1a920 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a930 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1a940 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a950 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1a960 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1a970 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1a980 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1a990 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a9a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a9b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1a9c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1a9d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1a9e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1a9f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1aa00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1aa10 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1aa20 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
1aa30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1aa40 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
1aa50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1aa60 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
1aa70 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
1aa80 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
1aa90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
1aaa0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
1aab0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
1aac0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
1aad0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1aae0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1aaf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
1ab00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ab10 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
1ab20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ab30 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
1ab40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ab50 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
1ab60 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ab70 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
1ab80 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1ab90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1aba0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1abb0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1abc0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1abd0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1abe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1abf0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ac00 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1ac10 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1ac20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1ac30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ac40 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ac50 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1ac60 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1ac70 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1ac80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ac90 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1aca0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1acb0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1acc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1acd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1ace0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1acf0 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1ad00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1ad10 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1ad20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
1ad30 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1ad40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ad50 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1ad60 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1ad70 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1ad80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ad90 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ada0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1adb0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
1adc0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1add0 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1ade0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1adf0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ae00 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1ae10 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1ae30 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1ae40 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1ae50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ae60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ae70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ae80 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1ae90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1aea0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1aeb0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1aec0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
1aed0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1aee0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
1aef0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1af00 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1af10 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
1af20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1af30 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
1af40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1af50 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1af60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1af70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1af80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1af90 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1afa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1afb0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1afc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1afd0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1afe0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1aff0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1b000 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1b010 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1b020 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1b030 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1b040 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1b050 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49  , dest, 1, jumpI
1b060 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1b070 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1b080 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1b090 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
1b0a0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1b0b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b0c0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1b0d0 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
1b0e0 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
1b0f0 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
1b100 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1b110 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1b120 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1b130 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1b140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b150 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1b160 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1b170 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b180 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
1b190 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1b1a0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1b1b0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
1b1c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b1d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1b1e0 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1b1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b200 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1b210 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1b220 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1b230 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1b240 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1b250 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1b260 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1b270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b280 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1b290 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b2a0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1b2b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1b2c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1b2d0 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
1b2e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1b2f0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1b300 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1b310 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1b320 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1b330 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1b340 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1b350 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
1b360 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1b370 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1b380 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b390 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1b3a0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1b3b0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1b3c0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1b3d0 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
1b3e0 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
1b3f0 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
1b400 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
1b410 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
1b420 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
1b430 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
1b440 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
1b450 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1b460 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1b470 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1b480 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1b490 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1b4a0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1b4b0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1b4c0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1b4d0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1b4e0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1b4f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1b500 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1b510 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1b520 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1b530 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
1b540 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
1b550 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1b560 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
1b570 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
1b580 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
1b590 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
1b5a0 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
1b5b0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
1b5c0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1b5d0 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
1b5e0 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
1b5f0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
1b600 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1b610 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
1b620 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
1b630 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
1b640 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
1b650 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
1b660 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1b670 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
1b680 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
1b690 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
1b6a0 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
1b6b0 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
1b6c0 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
1b6d0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1b6f0 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1b700 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
1b710 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
1b720 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
1b730 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
1b740 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
1b750 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
1b760 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
1b770 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
1b780 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
1b790 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1b7a0 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
1b7b0 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
1b7c0 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
1b7d0 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
1b7e0 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
1b7f0 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
1b800 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
1b810 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
1b820 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
1b830 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
1b840 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
1b850 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
1b860 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
1b870 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
1b880 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
1b890 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
1b8a0 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
1b8b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1b8c0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
1b8d0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
1b8e0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1b8f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
1b900 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
1b910 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
1b920 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1b930 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
1b940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1b950 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
1b960 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
1b970 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b980 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
1b990 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
1b9a0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1b9b0 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
1b9c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1b9d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
1b9e0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
1b9f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ba00 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
1ba10 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
1ba20 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1ba30 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1ba40 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
1ba50 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1ba60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ba70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1ba80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ba90 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1baa0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1bab0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1bac0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1bad0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1bae0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1baf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bb00 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1bb10 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1bb20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1bb30 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1bb40 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1bb50 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1bb60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bb70 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1bb80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1bb90 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1bba0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1bbb0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1bbc0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1bbd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bbe0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1bbf0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1bc00 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1bc10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bc20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1bc30 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1bc40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1bc50 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1bc60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bc70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1bc80 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1bc90 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1bca0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1bcb0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1bcc0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1bcd0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1bce0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1bcf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bd00 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1bd10 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1bd20 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1bd30 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1bd40 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1bd50 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1bd60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1bd70 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1bd80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1bd90 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1bda0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1bdb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bdc0 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1bdd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1bde0 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1bdf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1be00 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1be10 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1be20 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1be30 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1be40 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1be50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1be60 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1be70 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1be80 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1be90 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1bea0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1beb0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1bec0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1bed0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1bee0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1bef0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1bf00 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1bf10 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1bf20 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1bf30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bf40 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1bf50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bf60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1bf70 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1bf80 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1bf90 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1bfa0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
1bfb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1bfc0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1bfd0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1bfe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bff0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1c000 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1c010 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1c020 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c030 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1c040 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1c050 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1c060 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
1c070 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
1c080 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f   TK_EQ;.      co
1c090 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1c0a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1c0b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1c0c0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1c0d0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1c0e0 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1c0f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c100 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1c110 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c120 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1c130 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c140 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c150 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1c160 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1c170 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1c180 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1c190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c1a0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1c1b0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1c1c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c1d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c1e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1c1f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c200 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1c210 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1c220 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1c230 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1c240 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c250 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1c260 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1c270 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1c280 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1c290 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1c2a0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1c2b0 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 0, jumpIfNull)
1c2c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c2d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c2e0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
1c2f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20   jumpIfNull ){. 
1c300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c310 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1c320 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
1c330 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
1c340 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65  {.        int de
1c350 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
1c360 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1c370 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
1c380 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1c390 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1c3a0 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
1c3b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c3c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1c3d0 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
1c3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1c3f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
1c400 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1c410 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1c420 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1c430 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1c440 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1c450 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1c460 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
1c470 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
1c480 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c490 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1c4a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c4b0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1c4c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c4d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c4e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1c4f0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1c500 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1c510 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1c520 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
1c530 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
1c540 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
1c550 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
1c560 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
1c570 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
1c580 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
1c590 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
1c5a0 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
1c5b0 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
1c5c0 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
1c5d0 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
1c5e0 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
1c5f0 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
1c600 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
1c610 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
1c620 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
1c630 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
1c640 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
1c650 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1c660 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
1c670 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
1c680 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
1c690 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
1c6a0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
1c6b0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
1c6c0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
1c6d0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
1c6e0 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
1c6f0 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
1c700 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1c710 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
1c720 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
1c730 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
1c740 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
1c750 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1c760 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
1c770 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
1c780 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
1c790 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
1c7a0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
1c7b0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
1c7c0 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
1c7d0 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
1c7e0 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
1c7f0 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
1c800 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
1c810 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
1c820 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
1c830 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
1c840 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
1c850 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
1c860 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
1c870 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
1c880 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
1c890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1c8a0 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
1c8b0 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
1c8c0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
1c8d0 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20  =0||pB==0 ){.   
1c8e0 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
1c8f0 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73   0 : 2;.  }.  as
1c900 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1c910 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  yProperty(pA, EP
1c920 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1c930 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65  duced) );.  asse
1c940 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
1c950 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54  roperty(pB, EP_T
1c960 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
1c970 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78  ced) );.  if( Ex
1c980 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
1c990 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c9a0 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
1c9b0 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pB, EP_xIsSel
1c9c0 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
1c9d0 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
1c9e0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1c9f0 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
1ca00 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1ca10 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
1ca20 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
1ca30 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 32  B->op ) return 2
1ca40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
1ca50 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
1ca60 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29  Left, pB->pLeft)
1ca70 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1ca80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
1ca90 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
1caa0 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20  , pB->pRight) ) 
1cab0 72 65 74 75 72 6e 20 32 3b 0a 0a 20 20 69 66 28  return 2;..  if(
1cac0 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20   pA->x.pList && 
1cad0 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20  pB->x.pList ){. 
1cae0 20 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69     if( pA->x.pLi
1caf0 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78  st->nExpr!=pB->x
1cb00 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  .pList->nExpr ) 
1cb10 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 66 6f  return 2;.    fo
1cb20 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70  r(i=0; i<pA->x.p
1cb30 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1cb40 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1cb50 45 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c  ExprA = pA->x.pL
1cb60 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
1cb70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
1cb80 70 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73  prB = pB->x.pLis
1cb90 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
1cba0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1cbb0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
1cbc0 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
1cbd0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1cbe0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e  }else if( pA->x.
1cbf0 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70  pList || pB->x.p
1cc00 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
1cc10 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 2;.  }..  if(
1cc20 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
1cc30 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
1cc40 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
1cc50 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
1cc60 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1cc70 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74  perty(pA, EP_Int
1cc80 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66  Value) ){.    if
1cc90 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1cca0 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pB, EP_IntVal
1ccb0 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61  ue) || pA->u.iVa
1ccc0 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue!=pB->u.iValu
1ccd0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1cce0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 2;.    }.  }el
1ccf0 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  se if( pA->op!=T
1cd00 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
1cd10 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
1cd20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1cd30 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1cd40 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70 42  lue) || NEVER(pB
1cd50 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29  ->u.zToken==0) )
1cd60 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
1cd70 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1cd80 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
1cd90 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
1cda0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cdb0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
1cdc0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
1cdd0 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d  EP_ExpCollate)!=
1cde0 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
1cdf0 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 20 72 65  ExpCollate) ) re
1ce00 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 28 70  turn 1;.  if( (p
1ce10 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  A->flags & EP_Ex
1ce20 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20 26 26 20  pCollate)!=0 && 
1ce30 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d 3e 70  pA->pColl!=pB->p
1ce40 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20 32 3b  Coll ) return 2;
1ce50 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1ce60 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1ce70 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1ce80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1ce90 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
1cea0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1ceb0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
1cec0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
1ced0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
1cee0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
1cef0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
1cf00 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
1cf10 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
1cf20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
1cf30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
1cf40 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1cf50 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
1cf60 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
1cf70 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
1cf80 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
1cf90 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
1cfa0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
1cfb0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
1cfc0 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c  pInfo->nColumnAl
1cfd0 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
1cfe0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
1cff0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
1d000 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1d010 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
1d020 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
1d030 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1d040 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
1d050 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
1d060 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1d070 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
1d080 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1d090 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
1d0a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
1d0b0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
1d0c0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
1d0d0 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
1d0e0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1d0f0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
1d100 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
1d110 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
1d120 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
1d130 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
1d140 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
1d150 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
1d160 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  uncAlloc,.      
1d170 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
1d180 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
1d190 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
1d1a0 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
1d1b0 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
1d1c0 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
1d1d0 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
1d1e0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1d1f0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
1d200 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1d210 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
1d220 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
1d230 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
1d240 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1d250 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
1d260 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
1d270 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
1d280 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
1d290 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
1d2a0 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
1d2b0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
1d2c0 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
1d2d0 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
1d2e0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
1d2f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1d300 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
1d310 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
1d320 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
1d330 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1d340 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d350 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
1d360 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1d370 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1d380 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d390 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1d3a0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1d3b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1d3c0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
1d3d0 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
1d3e0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
1d3f0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
1d400 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
1d410 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
1d420 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
1d430 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
1d440 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1d450 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1d460 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
1d470 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1d480 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
1d490 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1d4a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
1d4b0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1d4c0 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
1d4d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d4e0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
1d4f0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
1d500 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1d510 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1d520 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
1d530 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
1d540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d550 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1d560 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
1d570 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
1d580 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
1d590 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
1d5a0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1d5b0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
1d5c0 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
1d5d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
1d5e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
1d5f0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
1d600 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
1d610 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
1d620 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
1d630 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
1d640 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
1d650 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
1d660 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1d670 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
1d680 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
1d690 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
1d6a0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1d6b0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
1d6c0 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
1d6d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d6e0 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
1d6f0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
1d700 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1d710 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
1d720 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
1d730 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
1d740 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d750 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d770 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
1d780 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1d790 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
1d7a0 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
1d7b0 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
1d7c0 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
1d7d0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
1d7e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d7f0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
1d800 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
1d810 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
1d820 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
1d830 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
1d840 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
1d850 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1d870 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
1d880 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
1d890 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1d8a0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
1d8b0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1d8c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1d8d0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1d8f0 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
1d900 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1d910 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
1d920 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
1d930 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
1d940 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
1d950 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1d960 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
1d970 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
1d980 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1d990 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1d9a0 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1d9c0 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1d9e0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
1d9f0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1da10 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
1da20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1da30 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
1da40 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1da50 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
1da60 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
1da90 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
1daa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dab0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
1dac0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
1dad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1db20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1db30 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
1db40 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1db60 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1db70 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
1db80 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1dba0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
1dbc0 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
1dbd0 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
1dbe0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1dbf0 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
1dc00 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
1dc10 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
1dc20 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
1dc30 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
1dc40 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
1dc50 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
1dc60 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
1dc70 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
1dc80 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
1dc90 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
1dca0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
1dcb0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
1dcc0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
1dcd0 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
1dce0 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
1dcf0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
1dd00 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
1dd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
1dd20 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
1dd30 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
1dd40 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
1dd50 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
1dd60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd70 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
1dd80 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
1dd90 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
1dda0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
1ddb0 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
1ddc0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
1ddd0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
1dde0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1ddf0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1de00 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1de10 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44    /* The pNC->nD
1de20 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75  epth==0 test cau
1de30 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1de40 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75  nctions in subqu
1de50 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  eries.      ** t
1de60 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a  o be ignored */.
1de70 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e        if( pNC->n
1de80 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Depth==0 ){.    
1de90 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1dea0 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
1deb0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
1dec0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
1ded0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
1dee0 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
1def0 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
1df00 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
1df10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1df20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1df30 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
1df40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1df50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1df60 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1df70 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
1df80 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1df90 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1dfa0 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
1dfb0 72 2c 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a  r, pExpr)==0 ){.
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1dfd0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1dfe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dff0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
1e000 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
1e010 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
1e020 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
1e030 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
1e040 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1e050 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
1e060 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
1e070 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
1e080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
1e090 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
1e0a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
1e0b0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
1e0c0 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
1e0d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e0e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e0f0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1e100 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
1e110 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
1e120 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
1e130 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
1e140 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
1e150 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1e160 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
1e170 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1e180 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1e190 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e1a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1e1b0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1e1c0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
1e1d0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
1e1e0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
1e1f0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
1e200 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1e210 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65  u.zToken, sqlite
1e220 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
1e230 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e250 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
1e260 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1e270 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
1e280 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1e290 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1e2a0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
1e2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e2c0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
1e2d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1e2e0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
1e2f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e300 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
1e310 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
1e320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1e340 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
1e350 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
1e360 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
1e370 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
1e380 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
1e390 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e3a0 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1e3b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
1e3c0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
1e3d0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
1e3e0 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
1e3f0 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
1e400 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
1e410 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
1e420 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1e430 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
1e440 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1e450 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Prune;.      }. 
1e460 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e470 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e480 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
1e490 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
1e4a0 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
1e4b0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1e4c0 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65  pSelect){.  Name
1e4d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
1e4e0 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
1e4f0 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68   if( pNC->nDepth
1e500 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ==0 ){.    pNC->
1e510 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71  nDepth++;.    sq
1e520 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1e530 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74  pWalker, pSelect
1e540 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  );.    pNC->nDep
1e550 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  th--;.    return
1e560 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65   WRC_Prune;.  }e
1e570 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1e580 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1e590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  }.}../*.** Analy
1e5a0 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
1e5b0 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
1e5c0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
1e5d0 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
1e5e0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
1e5f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
1e600 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
1e610 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
1e620 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
1e630 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
1e640 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
1e650 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
1e660 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
1e670 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
1e680 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
1e690 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
1e6a0 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
1e6b0 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
1e6c0 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
1e6d0 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
1e6e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1e6f0 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
1e700 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
1e710 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
1e720 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
1e730 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
1e740 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
1e750 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1e760 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
1e770 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
1e780 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
1e790 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
1e7a0 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
1e7b0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
1e7c0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
1e7d0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
1e7e0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1e7f0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
1e800 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1e810 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
1e820 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
1e830 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1e840 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
1e850 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
1e860 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
1e870 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
1e880 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
1e890 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
1e8a0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
1e8b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
1e8c0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
1e8d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1e8e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1e8f0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
1e900 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1e910 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
1e920 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
1e930 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1e940 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1e950 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
1e960 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1e970 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1e980 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
1e990 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
1e9a0 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
1e9b0 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
1e9c0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
1e9d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1e9e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1e9f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1ea00 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
1ea10 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
1ea20 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
1ea30 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
1ea40 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
1ea50 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
1ea60 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
1ea70 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
1ea80 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
1ea90 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
1eaa0 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
1eab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
1eac0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
1ead0 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
1eae0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1eaf0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
1eb00 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  allocation is de
1eb10 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1eb20 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69   column cache li
1eb30 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20  ne that uses.** 
1eb40 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63  the register bec
1eb50 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76  omes stale..*/.v
1eb60 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
1eb70 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
1eb80 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1eb90 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
1eba0 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
1ebb0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
1ebc0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
1ebd0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1ebe0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1ebf0 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  e *p;.    for(i=
1ec00 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1ec10 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1ec20 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1ec30 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1ec40 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1ec50 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65  ){.        p->te
1ec60 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  mpReg = 1;.     
1ec70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1ec80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
1ec90 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1eca0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1ecb0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
1ecc0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1ecd0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
1ece0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
1ecf0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
1ed00 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ers.*/.int sqlit
1ed10 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
1ed20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1ed30 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
1ed40 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  , n;.  i = pPars
1ed50 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
1ed60 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
1ed70 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
1ed80 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  g<=n ){.    asse
1ed90 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d  rt( !usedAsColum
1eda0 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
1edb0 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20  , i+n-1) );.    
1edc0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
1edd0 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
1ede0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
1edf0 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
1ee00 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
1ee10 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
1ee20 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1ee30 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
1ee40 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
1ee50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1ee60 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1ee70 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
1ee80 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65   nReg){.  sqlite
1ee90 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1eea0 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
1eeb0 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67  Reg);.  if( nReg
1eec0 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
1eed0 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
1eee0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
1eef0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
1ef00 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
1ef10 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.