/ Hex Artifact Content
Login

Artifact eefabaa4a3dc67309a754eb0eab1a163ff4c2bf3:


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 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
0c10: 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  op;.    pColl = 
0c20: 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  p->pColl;.    if
0c30: 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ( pColl ) break;
0c40: 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  .    op = p->op;
0c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
0c60: 21 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  !=0 && (.       
0c70: 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55   op==TK_AGG_COLU
0c80: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c  MN || op==TK_COL
0c90: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  UMN || op==TK_RE
0ca0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
0cb0: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 29 29 7b  _TRIGGER.    )){
0cc0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
0cd0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0ce0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0cf0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0d00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
0d10: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0d20: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0d30: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0d40: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0d50: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ster */.      co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
0d80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
0d90: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
0da0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
0db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0dc0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70         zColl = p
0dd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0de0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0df0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0e00: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0e10: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0e20: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
0e30: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
0e60: 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26  f( op!=TK_CAST &
0e70: 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29  & op!=TK_UPLUS )
0e80: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
0e90: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
0ea0: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
0eb0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0ec0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0ed0: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0ee0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0ef0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0f00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
0f10: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
0f20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0f30: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
0f40: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0f50: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
0f60: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
0f70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
0f80: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0f90: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0fa0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
0fb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0fc0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
0fd0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0fe0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
0ff0: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1000: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1010: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1020: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
1030: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
1040: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
1050: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
1060: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
1070: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1080: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1090: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
10a0: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
10b0: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
10c0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
10d0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
10e0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
10f0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1100: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1120: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
1130: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1160: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
1170: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1180: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1190: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11a0: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
11b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
11c0: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
11d0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
11e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
11f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1200: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1210: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
1220: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
1230: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
1240: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1250: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
1260: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
1270: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1290: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
12a0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
12b0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
12c0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
12d0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
12e0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
12f0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1300: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1310: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1320: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
1330: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
1340: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
1350: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1360: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
1370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1380: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1390: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
13a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
13b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
13c0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
13d0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
13e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
13f0: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1400: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1410: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1430: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
1440: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1450: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
1460: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
1470: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1480: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1490: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
14b0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
14c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
14f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1500: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1510: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
1520: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
1530: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
1540: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
1550: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
1560: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
1570: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1580: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1590: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
15a0: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
15b0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
15c0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
15d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
15e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
15f0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1600: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1610: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
1620: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
1630: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1640: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
1650: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
1660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1670: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1680: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1690: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
16a0: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
16b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
16c0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
16d0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
16e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1700: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1710: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
1720: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
1730: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1740: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
1750: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1760: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
1770: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1780: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a0: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
17b0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
17c0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
17d0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
17e0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
17f0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1800: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1810: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1820: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1830: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1840: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1850: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1860: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1870: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1880: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1890: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
18a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
18b0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
18c0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
18d0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1910: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1920: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1930: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1940: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1950: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1960: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1970: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1980: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1990: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19a0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
19b0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
19c0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
19d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
19e0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
19f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1a00: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1a10: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1a20: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1a30: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1a40: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1a50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1a60: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1a70: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1a80: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1a90: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1aa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1ab0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1ac0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ad0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1af0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1b00: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1b10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b20: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1b40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1b50: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b60: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1b70: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1b80: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1b90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ba0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1bb0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1bc0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1bd0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1be0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1c10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1c20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1c30: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1c40: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1c50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1c90: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1ca0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1cc0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1cd0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cf0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1d00: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1d10: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1d20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1d30: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d50: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1d80: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1d90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1da0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1db0: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
1dc0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1dd0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
1de0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1df0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e00: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
1e10: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1e20: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
1e30: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
1e40: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
1e50: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
1e60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
1e70: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
1e80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1e90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1ea0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1eb0: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
1ec0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
1ed0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
1ee0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
1f10: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
1f20: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
1f50: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
1f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f70: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
1f80: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
1f90: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1fa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1fb0: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1fc0: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fd0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fe0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1ff0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2010: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2020: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2030: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2040: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2060: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2080: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
20b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
20c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20e0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20f0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2100: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2110: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2120: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2130: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2140: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2150: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2180: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
21a0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
21b0: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
21c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21d0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21e0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2200: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2210: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2220: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2230: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2240: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2250: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2260: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2270: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2280: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2290: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22a0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
22b0: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
22c0: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22d0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22e0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22f0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2310: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2340: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2350: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2360: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2370: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2380: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2390: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
23a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
23c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2400: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2410: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2440: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2450: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2460: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24a0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
24b0: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
24c0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24d0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24e0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24f0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2500: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2510: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2520: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2530: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2540: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2550: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2560: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2570: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2580: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2590: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
25a0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
25b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
25c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25d0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2600: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2610: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2620: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2630: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2640: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2650: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2660: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2670: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2680: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2690: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
26a0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
26b0: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
26c0: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26d0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2700: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2710: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2720: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2730: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2740: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2760: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2770: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2780: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2790: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
27a0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
27b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
27c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27e0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27f0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2800: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2810: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2820: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2830: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2840: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2850: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2860: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2870: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2880: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2890: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
28a0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
28b0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
28c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28d0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28e0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28f0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2910: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2920: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2940: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2950: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2960: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2970: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2980: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2990: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
29a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
29c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2a10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2a20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a70: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a80: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a90: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2aa0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2ab0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2ac0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ad0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ae0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2af0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2b00: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2b10: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2b20: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ba0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2bb0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2bc0: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2bd0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2be0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bf0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2c00: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2c10: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2c20: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c30: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c40: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c50: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c60: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c70: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c80: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c90: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2ca0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2cb0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2cc0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2cd0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cf0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2d00: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2d10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2d20: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d30: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d40: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d50: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d60: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d70: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d80: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d90: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2da0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2db0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2dc0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2dd0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2de0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2df0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2e00: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2e10: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2e20: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e30: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e40: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e50: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e60: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e80: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ea0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2eb0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ee0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ef0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2f00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2f10: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2f20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f30: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f50: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f60: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f70: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f80: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2fa0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2fb0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2fc0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fd0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fe0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2ff0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3000: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3010: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3020: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3060: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3070: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3080: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3090: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
30a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
30b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
30d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
30e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
30f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3100: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3110: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3130: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3140: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3150: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3160: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3170: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3180: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3190: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31a0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
31b0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
31c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
31d0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31e0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31f0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3200: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3210: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3220: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3230: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3240: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3250: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3260: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3280: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3290: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
32a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
32b0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
32c0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
32d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32e0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32f0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3300: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3310: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3330: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3340: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3350: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3360: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3370: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3380: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3390: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
33a0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
33b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
33d0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33f0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3400: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3420: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3440: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3450: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3460: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3470: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3480: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3490: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
34a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34b0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
34c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
34d0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34e0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34f0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3500: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3510: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3520: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3530: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3540: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3550: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3560: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3570: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3580: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3590: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
35a0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
35b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
35c0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
35d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35e0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3600: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3610: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3640: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3650: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3670: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3680: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3690: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
36a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
36b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
36c0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
36d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36e0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36f0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3700: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3730: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3750: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3760: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3780: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3790: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
37a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
37b0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
37c0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
37d0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37e0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37f0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3800: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3820: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3830: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3840: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3850: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3860: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3870: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3880: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3890: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
38a0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
38b0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
38c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
38d0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38e0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38f0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3900: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3910: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3920: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3940: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3950: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3960: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3970: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3980: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3990: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
39a0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
39b0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
39c0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
39d0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39e0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39f0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3a00: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3a10: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3a20: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3a30: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3a40: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3a50: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3a60: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3a70: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3a80: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3a90: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3aa0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ab0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ae0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3af0: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3b00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3b10: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3b20: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3b30: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3b40: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3b50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3b60: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3b70: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3b80: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3b90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
3ba0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
3bb0: 6d 75 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e  must be FALSE in
3bc0: 20 61 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30   all cases and 0
3bd0: 20 69 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   if the.** expre
3be0: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74  ssion might be t
3bf0: 72 75 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rue.  This is an
3c00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
3c10: 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72  If is OK to.** r
3c20: 65 74 75 72 6e 20 30 20 68 65 72 65 20 65 76 65  eturn 0 here eve
3c30: 6e 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  n if the express
3c40: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
3c50: 77 61 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a  ways false (a .*
3c60: 2a 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  * false negative
3c70: 29 2e 20 20 42 75 74 20 69 74 20 69 73 20 61 20  ).  But it is a 
3c80: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
3c90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
3ca0: 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72  n.** might be tr
3cb0: 75 65 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20  ue in some rare 
3cc0: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61  circumstances (a
3cd0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
3ce0: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ).**.** Note tha
3cf0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
3d00: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63  ion is part of c
3d10: 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61  onditional for a
3d20: 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  .** LEFT JOIN, t
3d30: 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  hen we cannot de
3d40: 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69  termine at compi
3d50: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
3d60: 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20  or not.** is it 
3d70: 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73  true or false, s
3d80: 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  o always return 
3d90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3da0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
3db0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
3dc0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
3dd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3de0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
3df0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
3e00: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
3e10: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
3e20: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
3e30: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
3e40: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3e50: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3e60: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3e70: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3e80: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3e90: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3ea0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3eb0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
3ec0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
3ed0: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
3ee0: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
3ef0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
3f00: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
3f10: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
3f20: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
3f30: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
3f40: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
3f50: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
3f60: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3f70: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
3f80: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
3f90: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
3fa0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
3fb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3fc0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
3fd0: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
3fe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
3ff0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
4000: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
4010: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
4020: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
4030: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4040: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
4050: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
4060: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4070: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
4080: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
4090: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
40a0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
40b0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
40c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
40d0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
40e0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
40f0: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
4100: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
4110: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
4120: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
4130: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
4140: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
4150: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
4160: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
4170: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
4180: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
4190: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
41a0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
41b0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
41c0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
41d0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
41e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
41f0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
4200: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4210: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4220: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
4230: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4240: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
4250: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
4260: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
4270: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4280: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4290: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
42a0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
42b0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
42c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
42d0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
42e0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
42f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4300: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
4310: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
4320: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
4330: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
4340: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4350: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4360: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4370: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4380: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4390: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
43a0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
43b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
43c0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
43d0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
43e0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
43f0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4400: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4410: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4420: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4430: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4440: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4450: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4460: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4470: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4480: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4490: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
44a0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
44b0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
44c0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
44d0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
44e0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
44f0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4500: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4510: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4520: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4530: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4540: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4550: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4560: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
4570: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
4580: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
4590: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
45a0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
45b0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
45c0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
45d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
45e0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
45f0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
4600: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4610: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
4620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4640: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4660: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
4670: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4680: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
4690: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
46a0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
46b0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
46c0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
46d0: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
46e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
46f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
4700: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4710: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4720: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4730: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4740: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4750: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4760: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
4770: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
4780: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4790: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
47a0: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
47b0: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
47c0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
47d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
47e0: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
47f0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
4800: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
4810: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
4820: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
4830: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
4840: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
4850: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
4860: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
4870: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
4880: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
4890: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
48a0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
48b0: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
48c0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
48d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
48e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
48f0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4900: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4910: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
4920: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
4930: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
4940: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
4950: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
4960: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
4970: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
4980: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
4990: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
49a0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
49b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
49c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
49d0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
49e0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
49f0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
4a00: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
4a10: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4a20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
4a30: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
4a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4a50: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
4a60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
4a70: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
4a80: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
4a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
4aa0: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
4ab0: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
4ac0: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
4ad0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4ae0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
4af0: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
4b00: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
4b10: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
4b20: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
4b30: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
4b40: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
4b50: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
4b60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
4b70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
4b80: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
4b90: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
4ba0: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
4bb0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
4bc0: 61 7a 56 61 72 5b 69 5d 20 26 26 20 6d 65 6d 63  azVar[i] && memc
4bd0: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
4be0: 5b 69 5d 2c 7a 2c 6e 2b 31 29 3d 3d 30 20 29 7b  [i],z,n+1)==0 ){
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
4c00: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
4c10: 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20  (ynVar)i+1;.    
4c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4c40: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20       if( x==0 ) 
4c50: 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  x = pExpr->iColu
4c60: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4c70: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4c80: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20    }.    if( x>0 
4c90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  ){.      if( x>p
4ca0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a  Parse->nzVar ){.
4cb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
4cc0: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71  ;.        a = sq
4cd0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
4ce0: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4cf0: 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  , x*sizeof(a[0])
4d00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
4d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
4d20: 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64  * Error reported
4d30: 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c   through db->mal
4d40: 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20  locFailed */.   
4d50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
4d60: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
4d70: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
4d80: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
4d90: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
4da0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
4db0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
4dc0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
4dd0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
4de0: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
4df0: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
4e00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4e10: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
4e20: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
4e30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4e40: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
4e50: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4e60: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
4e70: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
4e80: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
4e90: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
4ea0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4eb0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4ec0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4ed0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4ee0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
4ef0: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
4f00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4f10: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4f20: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
4f30: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
4f40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4f50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4f60: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
4f70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  =0 ) return;.  /
4f80: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
4f90: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
4fa0: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
4fb0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
4fc0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
4fd0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4fe0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
4ff0: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
5000: 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ue>=0 );.  if( !
5010: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
5020: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
5030: 6c 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ly) ){.    sqlit
5040: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5050: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
5060: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5070: 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  e(db, p->pRight)
5080: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
5090: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
50a0: 5f 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d  _Reduced) && (p-
50b0: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61  >flags2 & EP2_Ma
50c0: 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20  llocedToken)!=0 
50d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
50f0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  zToken);.    }. 
5100: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5110: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5120: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
5130: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5140: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
5150: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
5160: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5170: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5180: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
5190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
51a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
51b0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
51c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
51d0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
51e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
51f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5200: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
5210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
5220: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
5230: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5240: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
5250: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5260: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5270: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5280: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5290: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
52b0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
52c0: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
52d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
52e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
52f0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
5300: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
5310: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5320: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
5330: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
5340: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
5350: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5360: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5370: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5380: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5390: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
53a0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
53b0: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
53c0: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
53d0: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
53e0: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
53f0: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
5400: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
5410: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
5420: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5430: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
5440: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
5450: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5460: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5470: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5480: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5490: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
54a0: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
54b0: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
54c0: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
54d0: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
54e0: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
54f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5530: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
5540: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5550: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
5560: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
5570: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
5580: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
5590: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
55a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
55b0: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
55c0: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
55d0: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
55e0: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
55f0: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
5600: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
5610: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
5620: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
5630: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
5640: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
5650: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
5660: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
5670: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
5680: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5690: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
56a0: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
56b0: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
56c0: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
56d0: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
56e0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
56f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
5700: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
5710: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
5720: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
5730: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
5740: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
5750: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
5760: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
5770: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
5780: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
5790: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
57a0: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
57b0: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
57c0: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
57d0: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
57e0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
57f0: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
5800: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
5810: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
5820: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
5830: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
5840: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
5850: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
5860: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
5870: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5880: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
5890: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
58a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
58b0: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
58c0: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
58d0: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
58e0: 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52  make a EXPRDUP_R
58f0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
5900: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
5910: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
5920: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
5930: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
5940: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
5950: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
5960: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
5970: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
5980: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
5990: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
59a0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
59b0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
59c0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
59d0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
59e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
59f0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5a00: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5a10: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
5a20: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
5a30: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
5a40: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
5a50: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
5a60: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
5a70: 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66  d */.  if( 0==(f
5a80: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5a90: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
5aa0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
5ab0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
5ac0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5ad0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
5ae0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
5af0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
5b00: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
5b10: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
5b20: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
5b30: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
5b40: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
5b50: 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20  dToken)==0 );.  
5b60: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c    assert( (p->fl
5b70: 61 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64  ags2 & EP2_Irred
5b80: 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  ucible)==0 );.  
5b90: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
5ba0: 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70  | p->pRight || p
5bb0: 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e  ->pColl || p->x.
5bc0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
5bd0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
5be0: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
5bf0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
5c00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
5c10: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5c20: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
5c30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5c40: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
5c50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5c60: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
5c70: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
5c80: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
5c90: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
5ca0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5cb0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
5cc0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
5cd0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
5ce0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
5cf0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
5d00: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5d10: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
5d20: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5d30: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
5d40: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5d50: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
5d60: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
5d70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5d80: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
5d90: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
5da0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
5db0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
5dc0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
5dd0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
5de0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
5df0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5e00: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5e10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
5e20: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
5e30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5e40: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5e50: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
5e60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5e70: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
5e80: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
5e90: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
5ea0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5eb0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
5ec0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
5ed0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5ee0: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
5ef0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
5f00: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
5f10: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
5f20: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
5f30: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
5f40: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
5f50: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
5f60: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
5f70: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
5f80: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
5f90: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
5fa0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
5fb0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
5fc0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
5fd0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
5fe0: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
5ff0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
6000: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
6010: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
6020: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
6030: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
6040: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6050: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
6060: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6070: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
6080: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6090: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
60a0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
60b0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
60c0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
60d0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
60e0: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
60f0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
6100: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
6110: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
6120: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
6130: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
6140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6150: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
6160: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
6170: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
6180: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
6190: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
61a0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
61b0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
61c0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
61d0: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
61e0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
61f0: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
6200: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
6210: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
6220: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
6230: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
6240: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
6250: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6260: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6270: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6280: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6290: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
62a0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
62b0: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
62c0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
62d0: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
62e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
62f0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
6300: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
6310: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
6320: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
6330: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
6340: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6360: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6370: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6380: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6390: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
63a0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
63b0: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
63c0: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
63d0: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
63e0: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
63f0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
6400: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
6410: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
6420: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
6430: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
6440: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6450: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6460: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6470: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6480: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6490: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
64a0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
64b0: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
64c0: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
64d0: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
64e0: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
64f0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6500: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6510: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6520: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6530: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6540: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6550: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6560: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6570: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6580: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6590: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
65a0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
65b0: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
65c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
65d0: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
65e0: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
65f0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6600: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6610: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6620: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6630: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6640: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6650: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6660: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6670: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6680: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6690: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
66a0: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
66b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
66c0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
66d0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
66e0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
66f0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6700: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6710: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6720: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6740: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6750: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6760: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6770: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6780: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6790: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
67a0: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
67b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
67c0: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
67d0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
67f0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6800: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6810: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6820: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6830: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6840: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6850: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6860: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6870: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6880: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6890: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
68a0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
68b0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
68c0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29  nOnly|EP_Static)
68d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
68e0: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
68f0: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
6900: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
6910: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
6920: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
6930: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
6940: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
6950: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
6960: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
6970: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
6980: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
6990: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
69a0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
69b0: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
69c0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
69d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
69e0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
69f0: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
6a00: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
6a10: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
6a20: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
6a30: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
6a40: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
6a50: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
6a60: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
6a70: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6a80: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6a90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
6aa0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
6ab0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6ac0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
6ad0: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
6ae0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
6af0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
6b00: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
6b10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6b20: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
6b30: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
6b40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
6b50: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6b60: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
6b70: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
6b80: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
6b90: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6ba0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
6bb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6bc0: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
6bd0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
6be0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6bf0: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
6c00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
6c10: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
6c20: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6c30: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
6c40: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
6c50: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6c60: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6c70: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6c80: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
6c90: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
6ca0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
6cb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6cc0: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
6cd0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
6ce0: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
6cf0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d10: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d    pNew->flags2 =
6d20: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6d30: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
6d40: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
6d50: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6d60: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6d70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6d80: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
6d90: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6da0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
6db0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
6dc0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
6dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6df0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
6e10: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
6e20: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
6e30: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
6e40: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
6e50: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
6e60: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
6e70: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
6e80: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
6e90: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
6ea0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
6eb0: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
6ec0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
6ed0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
6ee0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
6ef0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
6f00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
6f10: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
6f20: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
6f30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6f40: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
6f50: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
6f60: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
6f70: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
6f80: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
6f90: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
6fa0: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
6fb0: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
6fc0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
6fd0: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
6fe0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
6ff0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
7000: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
7010: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
7020: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
7030: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
7040: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
7050: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
7060: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
7070: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
7080: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
7090: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
70a0: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
70b0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
70c0: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
70d0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
70e0: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
70f0: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
7100: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
7110: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7120: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
7130: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
7140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7150: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
7160: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44  {.  return exprD
7170: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
7180: 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20   0);.}.ExprList 
7190: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
71a0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
71b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
71c0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
71d0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
71e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
71f0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
7200: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
7210: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7220: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7230: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7240: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
7250: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
7260: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7270: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
7280: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
7290: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
72a0: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
72b0: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
72c0: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
72d0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
72e0: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
72f0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
7300: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7310: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
7320: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
7330: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
7340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7350: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7360: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
7370: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
7380: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
7390: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
73a0: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
73b0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
73c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
73d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
73e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
73f0: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
7400: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
7410: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
7420: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7430: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7440: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
7450: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
7460: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7470: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
7480: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
7490: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
74a0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
74b0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
74c0: 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72     pItem->iOrder
74d0: 42 79 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d  ByCol = pOldItem
74e0: 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20  ->iOrderByCol;. 
74f0: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
7500: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
7510: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
7520: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7530: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
7540: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
7550: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
7560: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
7570: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
7580: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
7590: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
75a0: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
75b0: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
75c0: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
75d0: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
75e0: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
75f0: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
7600: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
7610: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
7620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7630: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7640: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7650: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
7660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7670: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
7680: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
7690: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
76a0: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
76b0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
76c0: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
76d0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
76e0: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
76f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
7700: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
7710: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
7720: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
7730: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
7740: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
7750: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7760: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
7770: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7780: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7790: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
77a0: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
77b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
77c0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
77d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
77e0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
77f0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
7800: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7810: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
7820: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
7830: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
7840: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
7850: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7860: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7870: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
7880: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
7890: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
78a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
78b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
78c0: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
78d0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
78e0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
78f0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
7900: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
7910: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
7920: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
7930: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
7940: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
7950: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
7960: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
7970: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
7980: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
7990: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
79a0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
79b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
79c0: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 70  isCorrelated = p
79d0: 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  OldItem->isCorre
79e0: 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  lated;.    pNewI
79f0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
7a00: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7a10: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64  , pOldItem->zInd
7a20: 65 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ex);.    pNewIte
7a30: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
7a40: 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pOldItem->notInd
7a50: 65 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74  exed;.    pNewIt
7a60: 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c  em->pIndex = pOl
7a70: 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20  dItem->pIndex;. 
7a80: 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74     pTab = pNewIt
7a90: 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49  em->pTab = pOldI
7aa0: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
7ab0: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
7ac0: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
7ad0: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
7ae0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
7af0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7b00: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
7b10: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
7b20: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
7b30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7b40: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
7b50: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
7b60: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
7b70: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
7b80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7b90: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
7ba0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
7bb0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
7bc0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
7bd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
7be0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
7bf0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7c00: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
7c10: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
7c20: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
7c30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7c40: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
7c50: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
7c60: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
7c70: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7c80: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7c90: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
7ca0: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
7cb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
7cc0: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
7cd0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
7ce0: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
7cf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7d00: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
7d10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
7d20: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
7d30: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
7d40: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
7d50: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
7d60: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
7d70: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
7d80: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
7d90: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
7da0: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
7db0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
7dc0: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
7dd0: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
7de0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
7df0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
7e00: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
7e10: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
7e20: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
7e30: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
7e40: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
7e50: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
7e60: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
7e70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7e80: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
7e90: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
7ea0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
7eb0: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
7ec0: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
7ed0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
7ee0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7ef0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
7f00: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
7f10: 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pNew, *pPrior;. 
7f20: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7f30: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7f40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7f50: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  w(db, sizeof(*p)
7f60: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7f70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f80: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
7f90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
7fa0: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
7fb0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7fc0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
7fd0: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
7fe0: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
7ff0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
8000: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8010: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
8020: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
8030: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
8040: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8050: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
8060: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
8070: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
8080: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
8090: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
80a0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
80b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
80c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
80d0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
80e0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
80f0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
8100: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
8110: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
8120: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
8130: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
8140: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
8150: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
8160: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
8170: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
8180: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8190: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
81a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
81b0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
81c0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
81d0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
81e0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
81f0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
8200: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
8210: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
8220: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
8230: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
8240: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
8250: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
8260: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
8270: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
8280: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
8290: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
82a0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
82b0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
82c0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
82d0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
82e0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
82f0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
8300: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
8310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
8320: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
8330: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
8340: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
8350: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8360: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
8370: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
8380: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
8390: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
83a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
83b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
83c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
83d0: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
83e0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
83f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
8400: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
8410: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
8420: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
8430: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
8440: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
8450: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
8460: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
8470: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
8480: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
8490: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
84a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
84b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
84c0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
84d0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
84e0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
84f0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
8500: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
8510: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
8520: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
8530: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
8540: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
8550: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8560: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
8570: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
8580: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8590: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
85a0: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
85b0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
85c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
85d0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
85e0: 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
85f0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8600: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
8610: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
8620: 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f  pList->a==0 ) go
8630: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c  to no_mem;.  }el
8640: 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  se if( (pList->n
8650: 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e  Expr & (pList->n
8660: 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  Expr-1))==0 ){. 
8670: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8680: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
8690: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
86a0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 20  Expr>0 );.    a 
86b0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
86c0: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c  oc(db, pList->a,
86d0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a   pList->nExpr*2*
86e0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
86f0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
8700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
8710: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
8720: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
8730: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8740: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
8750: 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74 72  if( 1 ){.    str
8760: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8770: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
8780: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
8790: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
87a0: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
87b0: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
87c0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
87d0: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Expr;.  }.  retu
87e0: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
87f0: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
8800: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
8810: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
8820: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
8830: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8840: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
8850: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8860: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
8870: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8880: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
8890: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
88a0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
88b0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
88c0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
88d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
88e0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
88f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
8900: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
8910: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
8920: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
8930: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
8940: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
8950: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
8960: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8970: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
8980: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
8990: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
89a0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
89b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
89c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
89d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
89e0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
89f0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
8a00: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
8a10: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
8a20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
8a30: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
8a40: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
8a50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
8a60: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
8a70: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
8a80: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
8a90: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
8aa0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
8ab0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
8ac0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
8ad0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8ae0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8af0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
8b00: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
8b10: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
8b20: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
8b30: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
8b40: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
8b50: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
8b60: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
8b70: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
8b80: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
8b90: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
8ba0: 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 70 49  f( dequote && pI
8bb0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c  tem->zName ) sql
8bc0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
8bd0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
8be0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8bf0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
8c00: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
8c10: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8c20: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
8c30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8c40: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
8c50: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
8c60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
8c70: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
8c80: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
8c90: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
8ca0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8cb0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
8cc0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8cd0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
8ce0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
8cf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
8d00: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
8d10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8d20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8d30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8d40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
8d50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
8d60: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
8d70: 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61  an. */.  ExprSpa
8d80: 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20  n *pSpan        
8d90: 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20   /* The span to 
8da0: 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20  be added */.){. 
8db0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8dc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
8dd0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
8de0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8df0: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
8e00: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
8e10: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8e20: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
8e30: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
8e40: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
8e50: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
8e60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
8e70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
8e80: 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d  | pItem->pExpr==
8e90: 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a  pSpan->pExpr );.
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8eb0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
8ec0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
8ed0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
8ee0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
8ef0: 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72  ar*)pSpan->zStar
8f00: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70         (int)(pSp
8f30: 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e  an->zEnd - pSpan
8f40: 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a  ->zStart));.  }.
8f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
8f60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
8f70: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
8f80: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
8f90: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
8fa0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8fb0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
8fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
8fd0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
8fe0: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
8ff0: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
9000: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
9010: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
9020: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
9030: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
9040: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
9050: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
9060: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
9070: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
9080: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
9090: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
90a0: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
90b0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
90c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
90d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
90e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
90f0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
9100: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
9110: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9120: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
9130: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
9140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9150: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
9160: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
9170: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
9180: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
9190: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
91a0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
91b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
91c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
91d0: 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e  a!=0 || pList->n
91e0: 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  Expr==0 );.  for
91f0: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
9200: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
9210: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
9220: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
9230: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9240: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
9250: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9260: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
9270: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9280: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
9290: 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  zSpan);.  }.  sq
92a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
92b0: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
92c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
92d0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
92e0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
92f0: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
9300: 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70  cks.  Walker.u.p
9310: 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  i is a pointer.*
9320: 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  * to an integer.
9330: 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
9340: 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e   are checking an
9350: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
9360: 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61  ee.** if it is a
9370: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20   constant.  Set 
9380: 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20  *Walker.u.pi to 
9390: 30 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  0 if the express
93a0: 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f  ion is.** not co
93b0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
93c0: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
93d0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
93e0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
93f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
9400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9410: 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20  IsConstant().** 
9420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9430: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
9440: 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  ().**     sqlite
9450: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
9460: 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a  rFunction().**.*
9470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
9480: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
9490: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
94a0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
94b0: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
94c0: 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61  >u.i is 3 then a
94d0: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
94e0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
94f0: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
9500: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9510: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9520: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
9530: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
9540: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
9550: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
9560: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
9570: 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78  er->u.i==3 && Ex
9580: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
9590: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
95a0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
95b0: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
95c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
95d0: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
95e0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
95f0: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
9600: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
9610: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
9620: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
9630: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
9640: 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d   ** and pWalker-
9650: 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  >u.i==2 */.    c
9660: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
9670: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
9680: 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74  er->u.i==2 ) ret
9690: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 0;.      /* 
96a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
96b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
96c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
96d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
96e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
96f0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
9700: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
9710: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9720: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
9730: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9740: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
9750: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9760: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9770: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
9780: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
97a0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
97b0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
97c0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
97d0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
97e0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
97f0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9800: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
9810: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
9820: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
9830: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
9840: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9850: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
9860: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
9870: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
9880: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
9890: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
98a0: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
98b0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64  ic int selectNod
98c0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
98d0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
98e0: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
98f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9900: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
9910: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
9920: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
9930: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
9940: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
9950: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
9960: 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ag){.  Walker w;
9970: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
9980: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
9990: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
99a0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
99b0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
99c0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
99d0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
99e0: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
99f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
9a00: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
9a10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9a20: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9a30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9a40: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9a50: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9a60: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9a70: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9a80: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
9a90: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
9aa0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
9ab0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
9ac0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
9ad0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
9ae0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
9af0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
9b00: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
9b10: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9b20: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9b30: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9b40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9b50: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9b60: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9b70: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9b80: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9b90: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9ba0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9bb0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
9bc0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
9bd0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9be0: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9bf0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9c00: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9c10: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9c20: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
9c30: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
9c40: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
9c50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9c60: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
9c70: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
9c80: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9c90: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
9ca0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9cb0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9cc0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9cd0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9ce0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
9cf0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
9d00: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
9d10: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
9d20: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
9d30: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
9d40: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
9d50: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
9d60: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
9d70: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9d80: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
9d90: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
9da0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
9db0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
9dc0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
9dd0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
9de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9df0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9e00: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
9e10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
9e20: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
9e30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
9e40: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
9e50: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
9e60: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
9e70: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
9e80: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
9e90: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9ea0: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
9eb0: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
9ec0: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
9ed0: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
9ee0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
9ef0: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
9f00: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
9f10: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
9f20: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9f30: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
9f40: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
9f50: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
9f60: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9f70: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
9f80: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
9f90: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
9fa0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
9fb0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
9fc0: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
9fd0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
9fe0: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
9ff0: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
a000: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
a010: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a020: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
a030: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
a040: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
a050: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
a060: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
a070: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
a080: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
a090: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
a0a0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
a0b0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
a0c0: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
a0d0: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
a0e0: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
a0f0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a100: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
a110: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a120: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
a130: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
a140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a150: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a160: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
a170: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
a180: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
a190: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
a1a0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
a1b0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
a1c0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
a1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a1e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
a1f0: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
a200: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a210: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
a220: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
a230: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
a240: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
a250: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
a260: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a270: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
a280: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
a290: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
a2a0: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
a2b0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
a2c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a2d0: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
a2e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
a2f0: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
a300: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
a310: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
a320: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
a330: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
a340: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
a350: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
a360: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
a370: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
a380: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
a390: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
a3a0: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
a3b0: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
a3c0: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
a3d0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
a3e0: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
a3f0: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
a400: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
a410: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
a420: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
a430: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
a440: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
a450: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
a460: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
a470: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
a480: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
a490: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
a4a0: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
a4b0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
a4c0: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
a4d0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
a4e0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
a4f0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
a500: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
a510: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
a520: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
a530: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
a540: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
a550: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
a560: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
a570: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
a580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a590: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
a5a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
a5b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a5c0: 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e   an OP_IsNull in
a5d0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 74  struction that t
a5e0: 65 73 74 73 20 72 65 67 69 73 74 65 72 20 69 52  ests register iR
a5f0: 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20  eg and jumps.** 
a600: 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73  to location iDes
a610: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
a620: 6e 20 69 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20  n iReg is NULL. 
a630: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52   The value in iR
a640: 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75  eg .** was compu
a650: 74 65 64 20 62 79 20 70 45 78 70 72 2e 20 20 49  ted by pExpr.  I
a660: 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74  f we can look at
a670: 20 70 45 78 70 72 20 61 74 20 63 6f 6d 70 69 6c   pExpr at compil
a680: 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65  e-time and.** de
a690: 74 65 72 6d 69 6e 65 20 74 68 61 74 20 69 74 20  termine that it 
a6a0: 63 61 6e 20 6e 65 76 65 72 20 67 65 6e 65 72 61  can never genera
a6b0: 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  te a NULL, then 
a6c0: 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  the OP_IsNull op
a6d0: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
a6e0: 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  e omitted..*/.vo
a6f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
a700: 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20  deIsNullJump(.  
a710: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
a720: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
a730: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a740: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78  on */.  const Ex
a750: 70 72 20 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f  pr *pExpr,  /* O
a760: 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 4f 50 5f  nly generate OP_
a770: 49 73 4e 75 6c 6c 20 69 66 20 74 68 69 73 20 65  IsNull if this e
a780: 78 70 72 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  xpr can be NULL 
a790: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
a7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 73 74           /* Test
a7b0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a7c0: 69 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  is register for 
a7d0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44  NULL */.  int iD
a7e0: 65 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  est           /*
a7f0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
a800: 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20  e value is null 
a810: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  */.){.  if( sqli
a820: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
a830: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
a840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a850: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
a860: 52 65 67 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d  Reg, iDest);.  }
a870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a880: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
a890: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
a8a0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
a8b0: 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
a8c0: 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
a8d0: 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
a8e0: 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
a8f0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
a900: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
a910: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a920: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
a930: 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
a940: 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
a950: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
a960: 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
a970: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
a980: 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
a990: 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
a9a0: 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
a9b0: 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
a9c0: 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
a9d0: 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
a9e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a9f0: 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
aa00: 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
aa10: 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
aa20: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
aa30: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
aa40: 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 31  _NONE ) return 1
aa50: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
aa60: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
aa70: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
aa80: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
aa90: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
aaa0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
aab0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
aac0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
aad0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
aae0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
aaf0: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
ab00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
ab10: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ab20: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
ab30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
ab40: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
ab50: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
ab60: 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
ab70: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
ab80: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
ab90: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
aba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
abb0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
abc0: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
abd0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
abe0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
abf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ac00: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
ac10: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
ac20: 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
ac30: 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
ac40: 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
ac50: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
ac60: 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
ac70: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
ac80: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
ac90: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
aca0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
acb0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
acc0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
acd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
ace0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
acf0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
ad00: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
ad10: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
ad20: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
ad30: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
ad40: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
ad50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ad60: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
ad70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
ad80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ad90: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
ada0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
adb0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
adc0: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
add0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
ade0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
adf0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
ae00: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68  e are able to th
ae10: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70  e IN operator op
ae20: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a  timization on a.
ae30: 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  ** query of the 
ae40: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
ae50: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
ae60: 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74  .).**.** Where t
ae70: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61  he SELECT... cla
ae80: 75 73 65 20 69 73 20 61 73 20 73 70 65 63 69 66  use is as specif
ae90: 69 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d  ied by the param
aea0: 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20  eter to this.** 
aeb0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
aec0: 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
aed0: 20 70 61 73 73 65 64 20 69 6e 20 68 61 73 20 61   passed in has a
aee0: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
aef0: 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a  rocessed and no.
af00: 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20 62  ** errors have b
af10: 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69  een found..*/.#i
af20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af30: 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
af40: 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74  c int isCandidat
af50: 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74  eForInOpt(Select
af60: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
af70: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
af80: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
af90: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
afa0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64     /* right-hand
afd0: 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53   side of IN is S
afe0: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
aff0: 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
b000: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
b010: 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f    /* Not a compo
b020: 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
b030: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
b040: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
b050: 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
b060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b070: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b080: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b090: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
b0a0: 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73  tinct );.    tes
b0b0: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
b0c0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
b0d0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
b0e0: 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
b0f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
b100: 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
b110: 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61  keyword and no a
b120: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
b130: 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  ns */.  }.  asse
b140: 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
b150: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b160: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
b170: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
b180: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
b190: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b1b0: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
b1c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
b1d0: 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b1f0: 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f  o LIMIT means no
b200: 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28   OFFSET */.  if(
b210: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
b220: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b230: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
b240: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
b250: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
b260: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
b270: 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
b280: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
b290: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
b2a0: 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
b2b0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
b2c0: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
b2d0: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
b2e0: 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
b2f0: 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
b300: 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
b310: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
b320: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56  .pTab;.  if( NEV
b330: 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65  ER(pTab==0) ) re
b340: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
b350: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
b360: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b370: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
b380: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
b390: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
b3a0: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
b3b0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
b3c0: 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
b3d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
b3e0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
b3f0: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
b400: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
b410: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f  eturn 0;       /
b420: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  * One column in 
b430: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b440: 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  /.  if( pEList->
b450: 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
b460: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
b470: 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20  rn 0; /* Result 
b480: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  is a column */. 
b490: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
b4a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b4b0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
b4c0: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
b4d0: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
b4e0: 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73  n and allocate s
b4f0: 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61  pace for its fla
b500: 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a  g. Return the .*
b510: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
b520: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
b530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b540: 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a  CodeOnce(Parse *
b550: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
b560: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b570: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
b580: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
b590: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
b5a0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
b5b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b5c0: 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73  , OP_Once, pPars
b5d0: 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a  e->nOnce++);.}..
b5e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b5f0: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
b600: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
b610: 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
b620: 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49  ) operator..** I
b630: 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69  t's job is to fi
b640: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
b650: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
b660: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
b670: 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65  .** either to te
b680: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
b690: 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73  p of the (...) s
b6a0: 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
b6b0: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20   through.** its 
b6c0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
b6d0: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
b6e0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
b6f0: 20 74 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e   the cursor open
b700: 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
b710: 20 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   (database table
b720: 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  , database index
b730: 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c   .** or ephermal
b740: 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65   table) is store
b750: 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20  d in pX->iTable 
b760: 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
b770: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
b780: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
b790: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
b7a0: 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
b7b0: 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
b7c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
b7d0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
b7e0: 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  ID - The cursor 
b7f0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
b800: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
b810: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
b820: 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72  DEX - The cursor
b830: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
b840: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 2e   database index.
b850: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
b860: 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f  PH -   The curso
b870: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
b880: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
b890: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
b8b0: 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
b8c0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  l table..**.** A
b8d0: 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
b8e0: 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  e may only be us
b8f0: 65 64 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ed if the SELECT
b900: 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d 70 6c   is of the simpl
b910: 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  e.** form:.**.**
b920: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
b930: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
b940: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  >.**.** If the p
b950: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
b960: 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ter is 0, then t
b970: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
b980: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
b990: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
b9a0: 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b   set members, sk
b9b0: 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69  ipping any dupli
b9c0: 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  cates. In this c
b9d0: 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65  ase an.** ephere
b9e0: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
b9f0: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
ba00: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
ba10: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
ba20: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
ba30: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
ba40: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
ba50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
ba60: 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55  or it.** has a U
ba70: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
ba80: 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
ba90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
baa0: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
bab0: 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
bac0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  en the b-tree wi
bad0: 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
bae0: 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
baf0: 65 72 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e  ership tests. In
bb00: 20 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 70   this case an ep
bb10: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
bb20: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
bb30: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
bb40: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
bb50: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
bb60: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
bb70: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
bb80: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
bb90: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
bba0: 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72  ** When the b-tr
bbb0: 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ee is being used
bbc0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
bbd0: 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69  tests, the calli
bbe0: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e  ng function.** n
bbf0: 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65  eeds to know whe
bc00: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bc10: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
bc20: 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a  ns an SQL NULL .
bc30: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ** value in orde
bc40: 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65  r to correctly e
bc50: 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
bc60: 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28  ons like "X IN (
bc70: 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68  Y, Z)"..** If th
bc80: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
bc90: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
bca0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
bcb0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
bcc0: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
bcd0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
bce0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
bcf0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
bd00: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
bd10: 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68  rNotFound. If th
bd20: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
bd30: 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
bd40: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
bd50: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
bd60: 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65  prNotFound is le
bd70: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
bd80: 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
bd90: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
bda0: 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
bdb0: 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74  stored in *prNot
bdc0: 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69  Found, then.** i
bdd0: 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  ts initial value
bde0: 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68   is NULL.  If th
bdf0: 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74  e (...) does not
be00: 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74   remain constant
be10: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61  .** for the dura
be20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72  tion of the quer
be30: 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45 4c 45  y (i.e. the SELE
be40: 43 54 20 77 69 74 68 69 6e 20 74 68 65 20 28 2e  CT within the (.
be50: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72  ..).** is a corr
be60: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 29  elated subquery)
be70: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
be80: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
be90: 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
bea0: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61  reset to NULL ea
beb0: 63 68 20 74 69 6d 65 20 74 68 65 20 73 75 62 71  ch time the subq
bec0: 75 65 72 79 20 69 73 20 72 65 72 75 6e 2e 20 54  uery is rerun. T
bed0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a  his allows the.*
bee0: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20  * caller to use 
bef0: 76 64 62 65 20 63 6f 64 65 20 65 71 75 69 76 61  vdbe code equiva
bf00: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
bf10: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  owing:.**.**   i
bf20: 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c  f( register==NUL
bf30: 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f  L ){.**     has_
bf40: 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20  null = <test if 
bf50: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
bf60: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
bf70: 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d 20       register = 
bf80: 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69  1.**   }.**.** i
bf90: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
bfa0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65   running the <te
bfb0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
bfc0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
bfd0: 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65  ll>.** test more
bfe0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e   often than is n
bff0: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66  ecessary..*/.#if
c000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c010: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
c020: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
c030: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c040: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70  Expr *pX, int *p
c050: 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65  rNotFound){.  Se
c060: 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20  lect *p;        
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
c090: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e   the right of IN
c0a0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
c0b0: 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20  nt eType = 0;   
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
c0e0: 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e  RHS table. IN_IN
c0f0: 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69  DEX_* */.  int i
c100: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
c110: 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  ab++;           
c120: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
c130: 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  e RHS table */. 
c140: 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75   int mustBeUniqu
c150: 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d  e = (prNotFound=
c160: 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  =0);   /* True i
c170: 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e  f RHS must be un
c180: 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ique */.  Vdbe *
c190: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c1a0: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
c1b0: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
c1c0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
c1d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d  /..  assert( pX-
c1e0: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20  >op==TK_IN );.. 
c1f0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
c200: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
c210: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
c220: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
c230: 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
c240: 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
c250: 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
c260: 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
c270: 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
c280: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ble..  */.  p = 
c290: 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
c2a0: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
c2b0: 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65  t) ? pX->x.pSele
c2c0: 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41  ct : 0);.  if( A
c2d0: 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45  LWAYS(pParse->nE
c2e0: 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64  rr==0) && isCand
c2f0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
c300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
c310: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c330: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
c340: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
c350: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
c380: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70  ble>. */.    Exp
c390: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c3c0: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
c3d0: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
c400: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c  x of column <col
c410: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn> */.    int 
c420: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
c450: 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a  dx for pTab */..
c460: 20 20 20 20 61 73 73 65 72 74 28 20 70 20 29 3b      assert( p );
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c490: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c4a0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c4c0: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
c4d0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c4e0: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c4f0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c500: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c510: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c520: 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
c530: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c540: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c550: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c560: 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
c570: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c580: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c590: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c5a0: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
c5b0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
c5c0: 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45     pExpr = p->pE
c5d0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c5e0: 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 45 78  ;.    iCol = pEx
c5f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
c600: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
c610: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
c620: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
c630: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
c640: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
c650: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c660: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
c670: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
c680: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
c690: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
c6a0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
c6b0: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
c6c0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
c6d0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
c6e0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
c6f0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
c700: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
c710: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
c720: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
c730: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
c740: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
c750: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
c760: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
c770: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
c780: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
c790: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
c7a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c7b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  {.      int iAdd
c7c0: 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  r;..      iAddr 
c7d0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
c7e0: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  e(pParse);..    
c7f0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
c800: 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
c810: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
c820: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
c830: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
c840: 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
c850: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c860: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
c870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
c880: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
c8b0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
c8c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
c8d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
c8e0: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
c8f0: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
c900: 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
c910: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
c920: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
c930: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
c940: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
c950: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
c960: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c970: 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f  ce.  */.      Co
c980: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
c990: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
c9a0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
c9b0: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
c9c0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
c9d0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
c9e0: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
c9f0: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
ca00: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
ca10: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
ca20: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
ca30: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
ca40: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
ca50: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
ca60: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
ca70: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
ca80: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
ca90: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
caa0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
cab0: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
cac0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
cad0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
cae0: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
caf0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
cb00: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
cb10: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
cb20: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
cb30: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
cb40: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
cb50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
cb60: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
cb70: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
cb80: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
cb90: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
cba0: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
cbb0: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70  azColl[0], 0)==p
cbc0: 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  Req.         && 
cbd0: 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c  (!mustBeUnique |
cbe0: 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
cbf0: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
cc00: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a  rror!=OE_None)).
cc10: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
cc20: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a       int iAddr;.
cc30: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
cc40: 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20  pKey;.  .       
cc50: 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20     pKey = (char 
cc60: 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  *)sqlite3IndexKe
cc70: 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
cc80: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dx);.          i
cc90: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
cca0: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
ccb0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c    .          sql
ccc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ccd0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
cce0: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
ccf0: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
cd20: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
cd30: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
cd40: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
cd50: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
cd60: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
cd70: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
cd80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cd90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
cda0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
cdb0: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
cdc0: 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  nd && !pTab->aCo
cdd0: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
cde0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
cdf0: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70  prNotFound = ++p
ce00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
ce10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ce20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ce30: 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74  _Null, 0, *prNot
ce40: 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Found);.        
ce50: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ce60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ce70: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
ce80: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
ce90: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69  not found an exi
cea0: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
ceb0: 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
cec0: 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
ced0: 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
cee0: 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
cef0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
cf00: 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
cf10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62  .    */.    doub
cf20: 6c 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  le savedNQueryLo
cf30: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
cf40: 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
cf50: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
cf60: 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
cf70: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
cf80: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
cf90: 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46  ){.      *prNotF
cfa0: 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e  ound = rMayHaveN
cfb0: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
cfc0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
cfd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cfe0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72   OP_Null, 0, *pr
cff0: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d  NotFound);.    }
d000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 65 73 74  else{.      test
d010: 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 6e 51  case( pParse->nQ
d020: 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75 62 6c 65  ueryLoop>(double
d030: 29 31 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  )1 );.      pPar
d040: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
d050: 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20   (double)1;.    
d060: 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d    if( pX->pLeft-
d070: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45  >iColumn<0 && !E
d080: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
d090: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
d0a0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ct) ){.        e
d0b0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
d0c0: 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20  ROWID;.      }. 
d0d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d0e0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
d0f0: 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
d100: 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
d110: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
d120: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
d130: 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
d140: 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73  ueryLoop;.  }els
d150: 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c  e{.    pX->iTabl
d160: 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20  e = iTab;.  }.  
d170: 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a  return eType;.}.
d180: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
d190: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
d1a0: 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65  scalar subquerie
d1b0: 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71  s used as a subq
d1c0: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c  uery expression,
d1d0: 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49   EXISTS,.** or I
d1e0: 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78  N operators.  Ex
d1f0: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
d200: 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
d210: 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
d220: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
d230: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
d240: 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
d250: 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
d260: 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
d270: 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
d280: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
d290: 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
d2a0: 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
d2b0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
d2c0: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
d2d0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
d2e0: 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
d2f0: 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
d300: 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
d310: 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  r describes the 
d320: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
d330: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a  contains the IN.
d340: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ** operator or s
d350: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  ubquery..**.** I
d360: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f  f parameter isRo
d370: 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  wid is non-zero,
d380: 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
d390: 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e   pExpr is guaran
d3a0: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66  teed.** to be of
d3b0: 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69   the form "<rowi
d3c0: 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22  d> IN (?, ?, ?)"
d3d0: 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20  , where <rowid> 
d3e0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a  is a reference.*
d3f0: 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65  * to some intege
d400: 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  r key column of 
d410: 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20  a table B-Tree. 
d420: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73  In this case, us
d430: 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42  e an.** intkey B
d440: 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74  -Tree to store t
d450: 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e  he set of IN(...
d460: 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64  ) values instead
d470: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
d480: 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62   (slower) variab
d490: 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42  le length keys B
d4a0: 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -Tree..**.** If 
d4b0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
d4c0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d  non-zero, that m
d4d0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70  eans that the op
d4e0: 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e  eration is an IN
d4f0: 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43  .** (not a SELEC
d500: 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64  T or EXISTS) and
d510: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69   that the RHS mi
d520: 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ght contains NUL
d530: 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f  Ls..** Furthermo
d540: 72 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e  re, the IN is in
d550: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
d560: 61 6e 64 20 74 68 61 74 20 77 65 20 72 65 61 6c  and that we real
d570: 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74  ly want.** to it
d580: 65 72 61 74 65 20 6f 76 65 72 20 74 68 65 20 52  erate over the R
d590: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d5a0: 72 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74  rator in order t
d5b0: 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65  o quickly locate
d5c0: 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f  .** all correspo
d5d0: 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e  nding LHS elemen
d5e0: 74 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ts.  All this ro
d5f0: 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
d600: 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20  itialize.** the 
d610: 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
d620: 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74  y rMayHaveNull t
d630: 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
d640: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
d650: 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63  ake.** care of c
d660: 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
d670: 69 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e  ister value to n
d680: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
d690: 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
d6a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
d6b0: 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20  veNull is zero, 
d6c0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
d6d0: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
d6e0: 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f  being used.** fo
d6f0: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
d700: 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72  ting only.  Ther
d710: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
d720: 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a  initialize any.*
d730: 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 69  * registers to i
d740: 6e 64 69 63 61 74 65 20 74 68 65 20 70 72 65 73  ndicate the pres
d750: 65 6e 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20  ense or absence 
d760: 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20  of NULLs on the 
d770: 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  RHS..**.** For a
d780: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
d790: 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
d7a0: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
d7b0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
d7c0: 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49  * result.  For I
d7d0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
d7e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d7f0: 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  s, the return va
d800: 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66  lue is 0..*/.#if
d810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d820: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
d830: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
d840: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
d850: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d860: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d870: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
d880: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
d890: 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c   The IN, SELECT,
d8a0: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
d8b0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61  tor */.  int rMa
d8c0: 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20  yHaveNull,      
d8d0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
d8e0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
d8f0: 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e  r NULLs exist in
d900: 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73   RHS */.  int is
d910: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
d920: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
d930: 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
d940: 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29   is a rowid */.)
d950: 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72  {.  int testAddr
d960: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
d970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d980: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
d990: 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
d9a0: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
d9d0: 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
d9e0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
d9f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
da00: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
da10: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
da20: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
da30: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
da40: 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
da50: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
da60: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
da70: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
da80: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
da90: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
daa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
dab0: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
dac0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
dad0: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
dae0: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
daf0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
db00: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
db10: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
db20: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
db30: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
db40: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
db50: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
db60: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
db70: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
db80: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
db90: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
dba0: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
dbb0: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
dbc0: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
dbd0: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
dbe0: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
dbf0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
dc00: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
dc10: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
dc20: 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
dc30: 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c    testAddr = sql
dc40: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
dc50: 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  rse);.  }..#ifnd
dc60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
dc70: 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61  XPLAIN.  if( pPa
dc80: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
dc90: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  ){.    char *zMs
dca0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
dcb0: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
dcc0: 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
dcd0: 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
dce0: 64 22 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f  d", testAddr>=0?
dcf0: 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22  "":"CORRELATED "
dd00: 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ,.        pExpr-
dd10: 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54  >op==TK_IN?"LIST
dd20: 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72  ":"SCALAR", pPar
dd30: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
dd40: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
dd50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
dd60: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
dd70: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
dd80: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
dd90: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65  DYNAMIC);.  }.#e
dda0: 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
ddb0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
ddc0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
ddd0: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
dde0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
ddf0: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
de00: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
de10: 4e 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e  N */.      KeyIn
de20: 66 6f 20 6b 65 79 49 6e 66 6f 3b 20 20 20 20 20  fo keyInfo;     
de30: 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
de40: 6f 20 66 6f 72 20 74 68 65 20 67 65 6e 65 72 61  o for the genera
de50: 74 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ted table */.   
de60: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de80: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
de90: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
dea0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
deb0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
dec0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f   pExpr->pLeft; /
ded0: 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * the LHS of the
dee0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
def0: 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48  .      if( rMayH
df00: 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  aveNull ){.     
df10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
df20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
df30: 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   0, rMayHaveNull
df40: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
df50: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
df60: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
df70: 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  (pLeft);..      
df80: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
df90: 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
dfa0: 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
dfb0: 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
dfc0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
dfd0: 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
dfe0: 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
dff0: 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
e000: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
e010: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
e020: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
e030: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
e040: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
e050: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
e060: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
e070: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
e080: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
e090: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
e0a0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
e0b0: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
e0c0: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
e0d0: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
e0e0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
e0f0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
e100: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
e110: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
e120: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
e130: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
e140: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
e150: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
e160: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
e170: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
e180: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
e190: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
e1a0: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
e1b0: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
e1c0: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
e1d0: 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
e1e0: 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
e1f0: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
e200: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
e210: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
e220: 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
e230: 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
e240: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
e250: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
e260: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
e270: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
e280: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e290: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
e2a0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21  pExpr->iTable, !
e2b0: 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  isRowid);.      
e2c0: 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
e2d0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
e2e0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
e2f0: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
e300: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
e310: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
e320: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
e330: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
e340: 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 1;..      if( 
e350: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e360: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
e370: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
e380: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
e390: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
e3a0: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
e3b0: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
e3c0: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
e3d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
e3e0: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
e3f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
e400: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
e410: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
e420: 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
e430: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
e440: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
e450: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
e460: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  *pEList;..      
e470: 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
e480: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  id );.        sq
e490: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
e4a0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
e4b0: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
e4c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
e4d0: 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 75 38 29  .affinity = (u8)
e4e0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
e4f0: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
e500: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
e510: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
e520: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ble );.        p
e530: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
e540: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
e550: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e560: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e570: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
e580: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
e590: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
e5a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e5b0: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
e5c0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
e5d0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
e5e0: 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21 3d 30  ALWAYS(pEList!=0
e5f0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
e600: 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20 20 20  r>0) ){ .       
e610: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
e620: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
e630: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
e640: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
e650: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
e660: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
e670: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
e680: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e690: 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
e6a0: 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
e6b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
e6c0: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
e6d0: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
e6e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
e6f0: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
e700: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
e710: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
e720: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
e730: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
e740: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
e750: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
e760: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
e770: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
e780: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
e790: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
e7a0: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
e7b0: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
e7c0: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
e7d0: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
e7e0: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
e7f0: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
e800: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
e810: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
e820: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
e830: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
e840: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e850: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
e860: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
e870: 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69  , r3;..        i
e880: 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
e890: 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
e8a0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
e8b0: 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
e8c0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
e8d0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
e8e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
e8f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e900: 66 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ft);..        /*
e910: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
e920: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
e930: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
e940: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
e950: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
e960: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
e970: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
e980: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
e990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e9a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e9b0: 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
e9c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
e9d0: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
e9e0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
e9f0: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
ea00: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
ea10: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
ea20: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
ea30: 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
ea40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ea50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
ea60: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
ea70: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
ea80: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
ea90: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
eaa0: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
eab0: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
eac0: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
ead0: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
eae0: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
eaf0: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
eb00: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
eb10: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
eb20: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
eb30: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
eb40: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
eb50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
eb60: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e     if( testAddr>
eb70: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
eb80: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
eb90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
eba0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ebb0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
ebc0: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
ebd0: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31     testAddr = -1
ebe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
ebf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
ec00: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
ec10: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
ec20: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
ec30: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
ec40: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
ec50: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
ec60: 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
ec70: 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
ec80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ec90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
eca0: 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
ecb0: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
ecc0: 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
ecd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ece0: 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
ecf0: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
ed00: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
ed10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
ed20: 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ed40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ed50: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
ed60: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
ed90: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
eda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
edb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
edc0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
edd0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
ede0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
edf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ee10: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ee20: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
ee30: 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
ee40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
ee50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ee60: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ee70: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
ee80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ee90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eea0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
eeb0: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
eec0: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
eed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
eee0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
eef0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ef00: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ef10: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
ef20: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ef30: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
ef40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ef50: 69 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a  if( !isRowid ){.
ef60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ef70: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
ef80: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65  ddr, (void *)&ke
ef90: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
efa0: 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
efb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
efc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
efd0: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
efe0: 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
eff0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
f000: 49 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62  If this has to b
f010: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
f020: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
f030: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
f040: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
f050: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
f060: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
f070: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
f080: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
f090: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
f0a0: 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68   iColumn.  If th
f0b0: 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
f0c0: 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
f0d0: 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
f0e0: 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
f0f0: 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d  exists) into a m
f100: 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20  emory cell.     
f110: 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74   ** and record t
f120: 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
f130: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
f140: 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
f150: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
f180: 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
f190: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
f1a0: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f1c0: 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
f1d0: 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20  h SELECt result 
f1e0: 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
f1f0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f200: 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
f210: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f220: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f230: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f240: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f250: 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
f260: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
f270: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
f280: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f290: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
f2a0: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70  lect) );.      p
f2b0: 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
f2c0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71  Select;.      sq
f2d0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
f2e0: 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b  nit(&dest, 0, ++
f2f0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20  pParse->nMem);. 
f300: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f310: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
f320: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
f330: 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
f340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f350: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f360: 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61  ull, 0, dest.iPa
f370: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
f380: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
f390: 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
f3a0: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
f3b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
f3c0: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
f3d0: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
f3e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f3f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
f400: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
f410: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f420: 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
f430: 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
f440: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f450: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
f460: 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e  arse->db, pSel->
f470: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
f480: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
f490: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
f4a0: 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
f4b0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
f4e0: 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20  ntTokens[1]);.  
f4f0: 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74      pSel->iLimit
f500: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f510: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
f520: 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
f530: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
f540: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
f550: 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73        rReg = des
f560: 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  t.iParm;.      E
f570: 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
f580: 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
f590: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f5a0: 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72  ..  if( testAddr
f5b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
f5c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f5d0: 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d  , testAddr);.  }
f5e0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
f5f0: 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
f600: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
f610: 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
f620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
f630: 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
f640: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
f650: 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
f660: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
f670: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
f680: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
f690: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
f6a0: 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
f6b0: 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
f6c0: 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
f6d0: 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
f6e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
f6f0: 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68  on.  The right-h
f700: 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a  and side (RHS).*
f710: 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
f720: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
f730: 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65  lues.  The expre
f740: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ssion is true if
f750: 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63   the LHS is.** c
f760: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
f770: 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61  the RHS.  The va
f780: 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  lue of the expre
f790: 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e  ssion is unknown
f7a0: 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68   (NULL).** if th
f7b0: 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72  e LHS is NULL or
f7c0: 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
f7d0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ot contained wit
f7e0: 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20  hin the RHS and 
f7f0: 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61  the.** RHS conta
f800: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
f810: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
f820: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f830: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 77  generates code w
f840: 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  ill jump to dest
f850: 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
f860: 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS is not .** co
f870: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
f880: 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
f890: 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
f8a0: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
f8b0: 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
f8c0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
f8d0: 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
f8e0: 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
f8f0: 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
f900: 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
f910: 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
f920: 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61   through..*/.sta
f930: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
f940: 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
f950: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f960: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
f970: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
f980: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f990: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
f9a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
f9b0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
f9c0: 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
f9d0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
f9e0: 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
f9f0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
fa00: 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
fa10: 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
fa20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
fa30: 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
fa40: 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
fa50: 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
fa60: 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
fa70: 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
fa80: 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
fa90: 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
faa0: 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68  L values */.  ch
fab0: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
fac0: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
fad0: 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  n affinity to us
fae0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  e */.  int eType
faf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fb00: 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20  Type of the RHS 
fb10: 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20  */.  int r1;    
fb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
fb30: 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
fb40: 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ster */.  Vdbe *
fb50: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
fb60: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
fb70: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
fb80: 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
fb90: 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74 65   the RHS.   Afte
fba0: 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65  r this step, the
fbb0: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
fbc0: 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69  or.  ** pExpr->i
fbd0: 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61  Table will conta
fbe0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
fbf0: 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
fc00: 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  RHS..  */.  v = 
fc10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
fc20: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
fc30: 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65         /* OOM de
fc40: 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20  tected prior to 
fc50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
fc60: 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
fc70: 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
fc80: 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65  expr"));.  eType
fc90: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
fca0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
fcb0: 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e 75 6c  xpr, &rRhsHasNul
fcc0: 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  l);..  /* Figure
fcd0: 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
fce0: 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
fcf0: 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
fd00: 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f  e results.  ** o
fd10: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fd20: 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
fd30: 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
fd40: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
fd50: 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f  r.  ** P4 of OP_
fd60: 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f  MakeRecord..  */
fd70: 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f  .  affinity = co
fd80: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
fd90: 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43  (pExpr);..  /* C
fda0: 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
fdb0: 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
fdc0: 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a  xpr> IN (...)"..
fdd0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
fde0: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
fdf0: 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  se);.  r1 = sqli
fe00: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
fe10: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
fe20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fe30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72   pExpr->pLeft, r
fe40: 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  1);..  /* If the
fe50: 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68   LHS is NULL, th
fe60: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
fe70: 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72   either false or
fe80: 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a   NULL depending.
fe90: 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20    ** on whether 
fea0: 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79  the RHS is empty
feb0: 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74   or not, respect
fec0: 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ively..  */.  if
fed0: 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
fee0: 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
fef0: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
ff00: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
ff10: 20 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65   where the false
ff20: 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d   and NULL outcom
ff30: 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  es are.    ** th
ff40: 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73  e same. */.    s
ff50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ff60: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
ff70: 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  1, destIfNull);.
ff80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
ff90: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
ffa0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ffb0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20  _NotNull, r1);. 
ffc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ffd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
ffe0: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
fff0: 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
10000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10010 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
10020 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
10030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10040 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10050 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  r1);.  }..  if( 
10060 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
10070 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ROWID ){.    /* 
10080 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
10090 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
100a0 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
100b0 65 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ee.    */.    sq
100c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
100d0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
100e0 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65   r1, destIfFalse
100f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10100 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
10110 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d  otExists, pExpr-
10120 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
10130 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 7d 65 6c  alse, r1);.  }el
10140 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  se{.    /* In th
10150 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
10160 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   is an index b-t
10170 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
10180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10190 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
101a0 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66  , r1, 1, 0, &aff
101b0 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20  inity, 1);..    
101c0 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65  /* If the set me
101d0 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61  mbership test fa
101e0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ils, then the re
101f0 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20  sult of the .   
10200 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22   ** "x IN (...)"
10210 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
10220 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20   be either 0 or 
10230 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74  NULL. If the set
10240 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  .    ** contains
10250 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c   no NULL values,
10260 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10270 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65   is 0. If the se
10280 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  t .    ** contai
10290 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e  ns one or more N
102a0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
102b0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
102c0 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73  he.    ** expres
102d0 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c  sion is also NUL
102e0 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  L..    */.    if
102f0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30  ( rRhsHasNull==0
10300 20 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65 3d   || destIfFalse=
10310 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
10320 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
10330 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69  nch runs if it i
10340 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69  s known at compi
10350 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65  le time that the
10360 20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63 61   RHS.      ** ca
10370 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  nnot contain NUL
10380 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
10390 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
103a0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66  sult.      ** of
103b0 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
103c0 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
103d0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
103e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
103f0 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73  ** Also run this
10400 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20   branch if NULL 
10410 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
10420 20 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20   FALSE.      ** 
10430 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75  for this particu
10440 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  lar IN operator.
10450 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10470 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
10480 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
10490 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
104a0 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 7d 65   r1, 1);..    }e
104b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
104c0 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68   this branch, th
104d0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
104e0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20  might contain a 
104f0 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 2a  NULL and.      *
10500 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  * the presence o
10510 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20  f a NULL on the 
10520 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66  RHS makes a diff
10530 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20  erence in the.  
10540 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a      ** outcome..
10550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10560 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a  nt j1, j2, j3;..
10570 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
10580 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
10590 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
105a0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20  ned in the RHS. 
105b0 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a   If so,.      **
105c0 20 74 68 65 6e 20 74 68 65 20 70 72 65 73 65 6e   then the presen
105d0 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74  ce of NULLs in t
105e0 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74 20  he RHS does not 
105f0 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a  matter, so jump.
10600 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c        ** over al
10610 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68  l of the code th
10620 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20  at follows..    
10630 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20    */.      j1 = 
10640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10650 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
10660 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10670 20 30 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20   0, r1, 1);..   
10680 20 20 20 2f 2a 20 48 65 72 65 20 77 65 20 62 65     /* Here we be
10690 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
106a0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 69 66  ode that runs if
106b0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 0a   the LHS is not.
106c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
106d0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
106e0 53 2e 20 20 47 65 6e 65 72 61 74 65 20 61 64 64  S.  Generate add
106f0 69 74 69 6f 6e 61 6c 20 63 6f 64 65 20 74 68 61  itional code tha
10700 74 0a 20 20 20 20 20 20 2a 2a 20 74 65 73 74 73  t.      ** tests
10710 20 74 68 65 20 52 48 53 20 66 6f 72 20 4e 55 4c   the RHS for NUL
10720 4c 73 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  Ls.  If the RHS 
10730 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20  contains a NULL 
10740 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75  then.      ** ju
10750 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
10760 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
10770 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20  no NULLs in the 
10780 52 48 53 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  RHS then.      *
10790 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  * jump to destIf
107a0 46 61 6c 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  False..      */.
107b0 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74        j2 = sqlit
107c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
107d0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73  OP_NotNull, rRhs
107e0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
107f0 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j3 = sqlite3Vdbe
10800 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
10810 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
10820 61 62 6c 65 2c 20 30 2c 20 72 52 68 73 48 61 73  able, 0, rRhsHas
10830 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  Null, 1);.      
10840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10850 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10860 20 2d 31 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c   -1, rRhsHasNull
10870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10880 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10890 6a 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  j3);.      sqlit
108a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
108b0 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 52 68 73 48  OP_AddImm, rRhsH
108c0 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20  asNull, 1);.    
108d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
108e0 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 0a 20  pHere(v, j2);.. 
108f0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
10900 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
10910 74 61 72 67 65 74 20 64 65 70 65 6e 64 69 6e 67  target depending
10920 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
10930 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ot.      ** the 
10940 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  RHS contains a N
10950 55 4c 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ULL.      */.   
10960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10970 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
10980 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74  RhsHasNull, dest
10990 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
109a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
109b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
109c0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20  destIfFalse);.. 
109d0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 46       /* The OP_F
109e0 6f 75 6e 64 20 61 74 20 74 68 65 20 74 6f 70 20  ound at the top 
109f0 6f 66 20 74 68 69 73 20 62 72 61 6e 63 68 20 6a  of this branch j
10a00 75 6d 70 73 20 68 65 72 65 20 77 68 65 6e 20 74  umps here when t
10a10 72 75 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 63  rue, .      ** c
10a20 61 75 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  ausing the overa
10a30 6c 6c 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  ll IN expression
10a40 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 66   evaluation to f
10a50 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 20 20 20  all through..   
10a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
10a70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10a80 76 2c 20 6a 31 29 3b 0a 20 20 20 20 7d 0a 20 20  v, j1);.    }.  
10a90 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
10aa0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
10ab0 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
10ac0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
10ad0 72 73 65 2c 20 31 29 3b 0a 20 20 56 64 62 65 43  rse, 1);.  VdbeC
10ae0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
10af0 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65  IN expr"));.}.#e
10b00 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10b10 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
10b20 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  ./*.** Duplicate
10b30 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65   an 8-byte value
10b40 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
10b50 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65 20  *dup8bytes(Vdbe 
10b60 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
10b70 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74  in){.  char *out
10b80 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
10b90 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
10ba0 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(v), 8);.  if
10bb0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d  ( out ){.    mem
10bc0 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b  cpy(out, in, 8);
10bd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75  .  }.  return ou
10be0 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  t;.}..#ifndef SQ
10bf0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
10c00 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
10c10 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
10c20 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
10c30 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
10c40 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
10c50 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
10c60 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
10c70 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
10c80 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
10c90 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
10ca0 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
10cb0 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
10cc0 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
10cd0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
10ce0 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
10cf0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
10d00 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
10d10 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
10d20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
10d30 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
10d40 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
10d50 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
10d60 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
10d70 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
10d80 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
10d90 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
10da0 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20     char *zV;.   
10db0 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
10dc0 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
10dd0 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
10de0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73  TE_UTF8);.    as
10df0 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
10e00 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a  NaN(value) ); /*
10e10 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65   The new AtoF ne
10e20 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20  ver returns NaN 
10e30 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74  */.    if( negat
10e40 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  eFlag ) value = 
10e50 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d  -value;.    zV =
10e60 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
10e70 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
10e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10e90 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op4(v, OP_Real, 
10ea0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
10eb0 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
10ec0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
10ed0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
10ee0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
10ef0 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
10f00 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
10f10 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
10f20 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
10f30 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
10f40 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
10f50 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
10f60 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
10f70 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
10f80 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
10f90 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
10fa0 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
10fb0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
10fc0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
10fd0 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
10fe0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
10ff0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
11000 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
11010 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
11020 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
11030 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
11040 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
11050 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11060 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
11070 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11080 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
11090 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
110a0 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
110b0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
110c0 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
110d0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 41 74     c = sqlite3At
110e0 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 2c 20  oi64(z, &value, 
110f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11100 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
11110 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c  ;.    if( c==0 |
11120 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c  | (c==2 && negFl
11130 61 67 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ag) ){.      cha
11140 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66 28  r *zV;.      if(
11150 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
11160 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c  e = c==2 ? SMALL
11170 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
11180 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d  ue; }.      zV =
11190 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
111a0 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
111b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
111c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36  ddOp4(v, OP_Int6
111d0 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  4, 0, iMem, 0, z
111e0 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  V, P4_INT64);.  
111f0 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
11200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
11210 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
11220 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11230 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69  (pParse, "oversi
11240 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25  zed integer: %s%
11250 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d  s", negFlag ? "-
11260 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73  " : "", z);.#els
11270 65 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  e.      codeReal
11280 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
11290 69 4d 65 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  iMem);.#endif.  
112a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
112b0 20 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65   Clear a cache e
112c0 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
112d0 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43  void cacheEntryC
112e0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
112f0 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43  se, struct yColC
11300 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  ache *p){.  if( 
11310 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20  p->tempReg ){.  
11320 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
11330 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
11340 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
11350 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  g) ){.      pPar
11360 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
11370 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
11380 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
11390 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  }.    p->tempReg
113a0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   = 0;.  }.}.../*
113b0 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68  .** Record in th
113c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74  e column cache t
113d0 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72  hat a particular
113e0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a   column from a.*
113f0 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  * particular tab
11400 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
11410 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
11420 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ister..*/.void s
11430 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
11440 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  tore(Parse *pPar
11450 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e  se, int iTab, in
11460 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67  t iCol, int iReg
11470 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
11480 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20  t minLru;.  int 
11490 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74  idxLru;.  struct
114a0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
114b0 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30    assert( iReg>0
114c0 20 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   );  /* Register
114d0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
114e0 61 79 73 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a  ays positive */.
114f0 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
11500 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38  -1 && iCol<32768
11510 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63   );  /* Finite c
11520 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f  olumn numbers */
11530 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
11540 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c  E_ColumnCache fl
11550 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ag disables the 
11560 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54  column cache.  T
11570 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  his is used.  **
11580 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c   for testing onl
11590 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68  y - to verify th
115a0 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73  at SQLite always
115b0 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61   gets the same a
115c0 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20  nswer.  ** with 
115d0 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
115e0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
115f0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
11600 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
11610 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
11620 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
11630 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e  First replace an
11640 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  y existing entry
11650 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ..  **.  ** Actu
11660 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68  ally, the way th
11670 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69  e column cache i
11680 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  s currently used
11690 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74  , we are guarant
116a0 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  eed.  ** that th
116b0 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65  e object will ne
116c0 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69  ver already be i
116d0 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79  n cache.  Verify
116e0 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e   this guarantee.
116f0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
11700 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20  EBUG.  for(i=0, 
11710 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11720 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11730 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11740 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
11750 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70   p->iReg==0 || p
11760 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
11770 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
11780 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
11790 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
117a0 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
117b0 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
117c0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
117d0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
117e0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
117f0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11800 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
11810 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
11820 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
11830 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
11840 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
11850 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
11860 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
11870 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
11880 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
11890 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c   = 0;.      p->l
118a0 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
118b0 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
118c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
118d0 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
118e0 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
118f0 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
11900 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
11910 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
11920 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11930 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11940 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11950 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11960 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
11970 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
11980 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
11990 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
119a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
119b0 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
119c0 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
119d0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
119e0 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
119f0 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
11a00 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
11a10 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
11a20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
11a30 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
11a40 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
11a50 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
11a60 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
11a70 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
11a80 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Cnt++;.    retur
11a90 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n;.  }.}../*.** 
11aa0 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
11ab0 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
11ac0 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
11ad0 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
11ae0 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
11af0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
11b00 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
11b10 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
11b20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
11b30 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
11b40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11b50 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
11b60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
11b70 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b  t iLast = iReg +
11b80 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72   nReg - 1;.  str
11b90 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
11ba0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
11bb0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11bc0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11bd0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11be0 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
11bf0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
11c00 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61  >=iReg && r<=iLa
11c10 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  st ){.      cach
11c20 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
11c30 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
11c40 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
11c50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
11c60 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
11c70 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
11c80 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
11c90 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
11ca0 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
11cb0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
11cc0 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
11cd0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
11ce0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
11cf0 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
11d00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11d10 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
11d20 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
11d30 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
11d40 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  l++;.}../*.** Re
11d50 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  move from the co
11d60 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65  lumn cache any e
11d70 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ntries that were
11d80 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65   added since the
11d90 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
11da0 20 4e 20 50 75 73 68 20 6f 70 65 72 61 74 69 6f   N Push operatio
11db0 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ns.  In other wo
11dc0 72 64 73 2c 20 72 65 73 74 6f 72 65 20 74 68 65  rds, restore the
11dd0 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65   cache.** to the
11de0 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
11df0 20 4e 20 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a   N Pushes ago..*
11e00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11e10 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65  prCachePop(Parse
11e20 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 4e 29   *pParse, int N)
11e30 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
11e40 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
11e50 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20  ;.  assert( N>0 
11e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11e70 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11e80 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=N );.  pParse-
11e90 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20  >iCacheLevel -= 
11ea0 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  N;.  for(i=0, p=
11eb0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11ec0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
11ed0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
11ee0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
11ef0 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
11f00 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
11f10 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
11f20 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
11f30 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
11f40 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
11f50 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
11f60 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
11f70 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
11f80 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
11f90 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
11fa0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
11fb0 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
11fc0 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
11fd0 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
11fe0 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
11ff0 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
12000 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
12010 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
12020 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
12030 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
12040 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
12050 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
12060 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
12070 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
12080 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12090 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
120a0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
120b0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
120c0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
120d0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
120e0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
120f0 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
12100 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
12110 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
12120 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12130 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
12140 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
12150 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
12160 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
12170 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
12180 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
12190 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
121a0 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
121b0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
121c0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
121d0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
121e0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
121f0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
12200 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
12210 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73   cursor for this
12220 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
12230 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
12240 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
12250 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
12260 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
12270 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
12280 65 20 76 61 6c 75 64 20 69 6e 74 6f 20 74 68 69  e valud into thi
12290 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
122a0 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
122b0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
122c0 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
122d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
122e0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
122f0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
12300 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
12310 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
12320 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
12330 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73  OP_Column;.    s
12340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12350 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
12360 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
12370 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
12380 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12390 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
123a0 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
123b0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
123c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
123d0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
123e0 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
123f0 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
12400 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
12410 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
12420 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
12430 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
12440 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
12450 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
12460 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
12470 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
12480 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
12490 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
124a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
124b0 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
124c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
124d0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
124e0 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
124f0 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
12500 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
12510 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
12520 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
12530 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
12540 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
12550 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
12560 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
12570 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
12580 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
12590 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
125a0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
125b0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
125c0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
125d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
125e0 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
125f0 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
12600 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
12610 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
12620 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
12630 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
12640 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
12650 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
12660 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
12670 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
12680 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
12690 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
126a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
126b0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
126c0 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  mn */.){.  Vdbe 
126d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
126e0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
126f0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
12700 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
12710 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
12720 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
12730 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
12740 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
12750 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
12760 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
12770 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
12780 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
12790 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
127a0 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
127b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
127c0 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
127d0 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
127e0 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
127f0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
12800 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
12810 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
12820 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
12830 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
12840 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
12850 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
12860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12870 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
12880 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
12890 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
128a0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
128b0 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
128c0 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
128d0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
128e0 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
128f0 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
12900 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
12910 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
12920 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
12930 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
12940 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
12950 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
12960 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
12970 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
12980 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
12990 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
129a0 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  g ){.      cache
129b0 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
129c0 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
129d0 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
129e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
129f0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
12a00 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
12a10 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
12a20 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
12a30 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
12a40 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
12a50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
12a60 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
12a70 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
12a80 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
12a90 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
12aa0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12ab0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
12ac0 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a  Start, iCount);.
12ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
12ae0 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
12af0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
12b00 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
12b10 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
12b20 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
12b30 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20  Reg-1. Keep the 
12b40 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d  column cache up-
12b50 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  to-date..*/.void
12b60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12b70 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
12b80 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
12b90 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
12ba0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
12bb0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
12bc0 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69  p;.  if( NEVER(i
12bd0 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74  From==iTo) ) ret
12be0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
12bf0 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
12c00 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
12c10 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
12c20 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  g);.  for(i=0, p
12c30 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
12c40 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
12c50 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
12c60 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  +){.    int x = 
12c70 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
12c80 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69   x>=iFrom && x<i
12c90 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20  From+nReg ){.   
12ca0 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54     p->iReg += iT
12cb0 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20  o-iFrom;.    }. 
12cc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
12cd0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 70  rate code to cop
12ce0 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  y content from r
12cf0 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
12d00 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
12d10 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
12d20 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69  o+nReg-1..*/.voi
12d30 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
12d40 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
12d50 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
12d60 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
12d70 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
12d80 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d  f( NEVER(iFrom==
12d90 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  iTo) ) return;. 
12da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67   for(i=0; i<nReg
12db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
12dd0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
12de0 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69  Copy, iFrom+i, i
12df0 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  To+i);.  }.}..#i
12e00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
12e10 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
12e20 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
12e30 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
12e40 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
12e50 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
12e60 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
12e70 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
12e80 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
12e90 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
12ea0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
12eb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
12ec0 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
12ed0 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
12ee0 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
12ef0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
12f00 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
12f10 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
12f20 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
12f30 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
12f40 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
12f50 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
12f60 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
12f70 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
12f80 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12f90 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12fa0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12fb0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12fc0 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
12fd0 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
12fe0 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
12ff0 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
13000 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
13010 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
13020 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
13030 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
13040 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  E_TEST */../*.**
13050 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
13060 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
13070 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
13080 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
13090 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
130a0 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
130b0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
130c0 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
130d0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
130e0 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
130f0 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
13100 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
13110 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
13120 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
13130 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
13140 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
13150 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
13160 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
13170 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
13180 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
13190 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
131a0 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
131b0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
131c0 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
131d0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
131e0 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
131f0 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
13200 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
13210 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
13220 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
13230 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
13240 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
13250 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
13260 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
13270 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
13280 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
13290 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132b0 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
132c0 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
132d0 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
132e0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
132f0 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
13300 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
13310 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
13320 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
13330 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
13340 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
13350 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
13360 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
13370 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
13380 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
13390 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
133a0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
133b0 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20  2, r3, r4;      
133c0 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
133d0 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
133e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
133f0 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54  pParse->db; /* T
13400 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
13410 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  ection */..  ass
13420 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
13430 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
13440 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76  >nMem );.  if( v
13450 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
13460 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
13470 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
13480 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13490 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
134a0 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
134b0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
134c0 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
134d0 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
134e0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
134f0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
13500 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
13510 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
13520 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
13530 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
13540 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
13550 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
13560 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
13570 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
13580 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
13590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
135a0 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
135b0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43        inReg = pC
135c0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
135d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
135e0 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
135f0 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
13600 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13610 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13620 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
13630 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
13640 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  PTab,.          
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
13670 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  rColumn, target)
13680 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
136a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
136b0 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
136c0 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
136d0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
136e0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
136f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
13700 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
13710 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
13720 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
13730 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
13740 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
13750 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13760 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20  >ckBase>0 );.   
13770 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
13780 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50  pr->iColumn + pP
13790 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20  arse->ckBase;.  
137a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
137b0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
137c0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
137d0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
137e0 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  r->pTab,.       
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
13810 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d  >iColumn, pExpr-
13820 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c  >iTable, target,
13830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20    pExpr->op2);. 
13860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13870 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13880 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
13890 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
138a0 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
138b0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
138c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
138d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
138e0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
138f0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
13900 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
13910 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
13920 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13930 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
13940 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
13950 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13960 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
13970 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13980 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
13990 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
139a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
139b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
139c0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
139d0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
139e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
139f0 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
13a00 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
13a10 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
13a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13a30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
13a40 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
13a50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13a60 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
13a70 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13a80 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13a90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
13aa0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
13ab0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
13ac0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
13ad0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
13ae0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
13af0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13b10 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
13b20 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
13b30 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
13b40 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
13b50 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13b60 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
13b70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13b80 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
13b90 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
13ba0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
13bb0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
13bc0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13bd0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
13be0 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
13bf0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
13c00 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
13c10 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
13c20 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
13c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13c40 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
13c50 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
13c60 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
13c70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13c80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13c90 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
13ca0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
13cb0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
13cc0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13cd0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
13ce0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
13cf0 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
13d00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
13d10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
13d20 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
13d30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13d40 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
13d50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
13d60 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
13d70 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13d80 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
13d90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13da0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
13db0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
13dc0 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
13dd0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
13de0 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
13df0 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
13e00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13e10 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
13e20 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
13e30 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
13e40 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
13e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13e60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13e70 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
13e80 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
13e90 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
13ea0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13eb0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13ec0 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
13ed0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
13ee0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
13ef0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13f00 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13f10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13f20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13f30 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
13f40 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
13f50 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
13f60 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
13f70 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
13f80 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
13f90 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
13fa0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
13fb0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13fc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13fd0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
13fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
13ff0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14000 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
14010 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) );.      aff =
14020 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
14030 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
14040 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f  oken);.      to_
14050 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54  op = aff - SQLIT
14060 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f  E_AFF_TEXT + OP_
14070 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73  ToText;.      as
14080 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
14090 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66  ToText    || aff
140a0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
140b0 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  T    );.      as
140c0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
140d0 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66  ToBlob    || aff
140e0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
140f0 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  E    );.      as
14100 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
14110 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
14120 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
14130 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
14140 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
14150 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66  ToInt     || aff
14160 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  !=SQLITE_AFF_INT
14170 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73  EGER );.      as
14180 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
14190 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66  ToReal    || aff
141a0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  !=SQLITE_AFF_REA
141b0 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65  L    );.      te
141c0 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
141d0 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20  P_ToText );.    
141e0 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
141f0 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a  p==OP_ToBlob );.
14200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14210 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
14220 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ric );.      tes
14230 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
14240 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  _ToInt );.      
14250 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
14260 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20  =OP_ToReal );.  
14270 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
14280 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
14290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
142a0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
142b0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
142c0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
142d0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
142e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
142f0 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70  eAddOp1(v, to_op
14300 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
14310 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
14320 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
14330 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
14340 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
14350 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
14360 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
14370 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
14380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14390 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
143a0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
143b0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
143c0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
143d0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
143e0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
143f0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
14400 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
14410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14420 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
14430 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14440 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
14450 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
14460 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
14470 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
14480 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
14490 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
144a0 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
144b0 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
144c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
144d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
144e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
144f0 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
14500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14510 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
14520 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14530 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
14540 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
14550 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
14560 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
14570 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14580 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14590 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
145a0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
145b0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
145c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
145d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
145e0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
145f0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
14600 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
14610 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
14620 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
14650 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
14660 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14670 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
14680 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14690 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
146a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
146b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
146c0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
146d0 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
146e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
146f0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
14700 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
14710 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
14720 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14730 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14740 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14750 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
14760 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14770 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14780 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
14790 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
147a0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
147b0 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
147c0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
147d0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
147e0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
147f0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
14810 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
14820 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c  TE_STOREP2 | SQL
14830 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
14840 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14850 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14860 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14870 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14880 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14890 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
148a0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
148b0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
148c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
148d0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
148e0 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
148f0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
14900 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
14910 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
14920 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
14930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
14940 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
14950 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
14960 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
14970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14980 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
14990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
149a0 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
149b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
149c0 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
149d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
149e0 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
149f0 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
14a00 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
14a10 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
14a20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
14a30 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
14a40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14a50 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
14a60 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
14a70 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
14a80 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
14a90 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
14aa0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
14ab0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14ac0 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
14ad0 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
14ae0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
14af0 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
14b00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14b10 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
14b20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14b30 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
14b40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14b50 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
14b60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14b70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
14b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14b90 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
14ba0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14bb0 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
14bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14bd0 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
14be0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14bf0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
14c00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14c10 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
14c20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14c30 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
14c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14c50 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
14c60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14c70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14c80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14c90 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14ca0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14cb0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14cc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14cd0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
14ce0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14cf0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
14d00 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
14d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d20 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
14d30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14d40 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14d50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14d70 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
14d80 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14d90 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
14da0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
14db0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
14dc0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
14dd0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
14de0 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
14df0 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
14e00 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  et);.#ifndef SQL
14e10 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
14e20 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
14e30 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
14e40 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
14e50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
14e60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14e70 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14e80 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
14e90 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
14ea0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
14eb0 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20  arget);.#endif. 
14ec0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14ed0 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72      regFree1 = r
14ee0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
14ef0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
14f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14f10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14f20 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a  nteger, 0, r1);.
14f30 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
14f40 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14f50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14f60 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
14f70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14f80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14f90 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
14fa0 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
14fb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14fc0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
14fe0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
14ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15000 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
15010 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
15020 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
15030 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
15040 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20  OP_BitNot );.   
15050 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
15060 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20  T==OP_Not );.   
15070 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15080 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
15090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
150a0 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
150b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
150c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
150d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
150e0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
150f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
15100 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
15110 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
15120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
15140 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
15150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15160 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
15170 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
15180 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
15190 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
151a0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
151b0 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
151c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
151d0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
151e0 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74  tNull );.      t
151f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15200 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
15210 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15220 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
15230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15240 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15250 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
15260 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15270 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15280 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15290 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
152a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
152b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
152c0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
152d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
152e0 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
152f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15300 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
15310 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20  target, -1);.   
15320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15330 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
15340 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15350 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15360 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
15370 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
15380 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
15390 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
153a0 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
153b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
153c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
153d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
153e0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e) );.        sq
153f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15400 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
15410 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29   aggregate: %s()
15420 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
15430 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
15440 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
15450 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
15460 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
15470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15480 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15490 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
154a0 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
154b0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
154c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
154d0 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
154e0 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
154f0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
15500 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
15510 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15520 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
15530 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
15540 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
15550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
15560 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
15570 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
15580 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
15590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
155a0 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74  gth of the funct
155b0 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  ion name in byte
155c0 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  s */.      const
155d0 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
155e0 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
155f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
15600 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
15610 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
15620 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
15630 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
15640 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
15650 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
15660 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15670 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
15680 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
15690 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
156a0 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
156b0 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
156c0 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
156d0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
156e0 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
156f0 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
15700 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15710 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15720 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
15730 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ) );.      testc
15740 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53  ase( op==TK_CONS
15750 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20  T_FUNC );.      
15760 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15770 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
15780 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e     if( ExprHasAn
15790 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
157a0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
157b0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
157c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
157d0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
157e0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
157f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15800 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
15810 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
15820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15830 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15840 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15850 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
15860 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
15870 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
15880 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15890 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
158a0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
158b0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
158c0 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
158d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
158e0 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
158f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15900 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
15910 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  own function: %.
15920 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
15930 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15940 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15950 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
15960 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
15970 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
15980 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
15990 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
159a0 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
159b0 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
159c0 63 65 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f  cessary evalatio
159d0 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
159e0 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
159f0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
15a00 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
15a10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
15a20 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
15a30 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
15a40 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
15a50 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
15a60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15a70 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
15a80 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
15a90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15aa0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
15ab0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
15ac0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
15ad0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
15ae0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
15af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15b00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b10 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
15b20 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
15b30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15b40 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
15b50 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
15b60 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
15b70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
15b80 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
15b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15ba0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
15bb0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
15bc0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15bd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15be0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
15bf0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
15c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15c10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15c20 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
15c30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15c40 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66      }...      if
15c50 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
15c60 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
15c70 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
15c80 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a 20 20 20  se, nFarg);..   
15c90 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
15ca0 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
15cb0 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
15cc0 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
15cd0 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
15ce0 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
15cf0 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
15d00 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
15d10 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
15d20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
15d30 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
15d40 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
15d50 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
15d60 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
15d70 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
15d80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
15d90 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  ( (pDef->flags &
15da0 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
15db0 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
15dc0 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
15dd0 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
15de0 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
15df0 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
15e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
15e10 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
15e20 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
15e30 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
15e40 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
15e50 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
15e60 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
15e70 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
15e80 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
15e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
15ea0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
15eb0 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
15ec0 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
15ed0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
15ee0 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
15ef0 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
15f00 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
15f10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
15f20 20 70 44 65 66 2d 3e 66 6c 61 67 73 3d 3d 53 51   pDef->flags==SQ
15f30 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
15f40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
15f50 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
15f60 72 2d 3e 6f 70 32 20 3d 20 70 44 65 66 2d 3e 66  r->op2 = pDef->f
15f70 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
15f80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
15f90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15fa0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
15fb0 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  );     /* Ticket
15fc0 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
15fd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15fe0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
15ff0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
16000 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r1, 1);.        
16010 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16020 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20  Pop(pParse, 1); 
16030 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
16040 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
16050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16060 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
16070 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16080 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16090 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
160a0 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
160b0 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
160c0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
160d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
160e0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
160f0 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
16100 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
16110 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
16120 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
16130 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
16140 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
16150 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
16160 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
16170 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
16180 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
16190 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
161a0 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
161b0 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
161c0 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
161d0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
161e0 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
161f0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
16200 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
16210 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
16220 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
16230 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
16240 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
16250 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
16260 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
16270 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
16280 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
16290 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
162a0 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
162b0 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
162c0 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
162d0 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
162e0 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
162f0 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
16300 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
16310 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
16320 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
16330 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
16340 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
16350 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
16360 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
16370 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
16380 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
16390 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
163a0 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
163b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
163c0 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
163d0 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
163e0 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
163f0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
16400 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
16410 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
16420 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16430 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
16440 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
16450 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
16460 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
16470 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
16480 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
16490 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
164a0 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
164b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
164c0 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
164d0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
164e0 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
164f0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
16500 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
16510 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
16520 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
16530 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
16540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16550 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20  ( pDef->flags & 
16560 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
16570 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
16580 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
16590 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
165a0 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
165b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
165c0 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
165d0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
165e0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
165f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16610 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
16620 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  n, constMask, r1
16630 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
16660 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
16670 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16680 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
16690 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
166a0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
166b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
166c0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
166d0 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
166e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
166f0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
16700 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16710 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
16720 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
16730 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
16740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16750 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
16760 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16770 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
16780 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
16790 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
167a0 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
167b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
167c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
167d0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
167e0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
167f0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
16800 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
16810 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
16820 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
16830 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
16840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
16860 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
16870 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16880 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
16890 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
168a0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
168b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
168c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
168d0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
168e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
168f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16900 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
16910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16930 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
16940 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
16950 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16960 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
16970 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16980 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
16990 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
169a0 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
169b0 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
169c0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
169d0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
169e0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
169f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16a00 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
16a10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
16a20 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
16a30 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
16a40 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
16a50 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
16a60 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
16a70 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
16a80 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
16a90 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
16aa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
16ab0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
16ac0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
16ad0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
16ae0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16af0 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
16b00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
16b10 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
16b20 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
16b30 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20  Expr;..      r1 
16b40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16b50 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
16b60 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
16b70 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
16b80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16b90 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
16ba0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
16bb0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16bc0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16bd0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16be0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
16bf0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
16c00 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16c10 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
16c20 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16c30 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
16c40 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
16c50 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
16c60 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
16c70 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
16c80 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
16c90 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  P2);.      pLIte
16ca0 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
16cb0 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
16cc0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
16cd0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16ce0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
16cf0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
16d00 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16d10 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
16d20 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
16d30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16d40 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
16d50 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
16d60 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
16d70 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20  ght, OP_Le, r1, 
16d80 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53  r2, r4, SQLITE_S
16d90 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73  TOREP2);.      s
16da0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16db0 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20  (v, OP_And, r3, 
16dc0 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r4, target);.   
16dd0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16de0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16df0 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r3);.      sqli
16e00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16e10 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20  g(pParse, r4);. 
16e20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16e30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
16e40 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
16e50 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
16e60 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
16e70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16e80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16e90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16ea0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
16eb0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
16ec0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
16ed0 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
16ee0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
16ef0 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
16f00 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
16f10 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
16f20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
16f30 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
16f40 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
16f50 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
16f60 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
16f70 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
16f80 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
16f90 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
16fa0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
16fb0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
16fc0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
16fd0 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
16fe0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
16ff0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
17000 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
17010 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
17020 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
17030 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
17040 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
17050 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17060 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
17070 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
17080 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
17090 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
170a0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
170b0 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
170c0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
170d0 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
170e0 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
170f0 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
17100 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
17110 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
17120 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
17130 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
17140 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
17150 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
17160 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
17170 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
17180 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
17190 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
171a0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
171b0 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
171c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
171d0 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
171e0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
171f0 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
17200 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
17210 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
17220 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
17230 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
17240 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
17250 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
17260 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
17270 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
17280 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
17290 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
172a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
172b0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
172c0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
172d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
172e0 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
172f0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
17300 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17310 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
17320 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
17330 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
17340 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
17350 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
17360 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
17370 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
17380 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
17390 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
173a0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
173b0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
173c0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
173d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
173e0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
173f0 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
17400 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
17410 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
17420 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
17430 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
17440 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
17450 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
17460 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
17470 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
17480 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
17490 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
174a0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
174b0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
174c0 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
174d0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
174e0 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
174f0 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
17500 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
17510 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
17520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17530 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
17540 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17550 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17560 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
17570 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
17580 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
17590 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
175a0 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
175b0 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
175c0 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
175d0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
175e0 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
175f0 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
17600 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17610 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
17620 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
17630 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
17640 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
17650 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
17660 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
17670 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
17680 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
17690 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
176a0 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
176b0 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   real.  */.     
176c0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
176d0 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
176e0 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
176f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
17700 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
17710 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
17720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17730 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17740 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
17750 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
17760 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
17770 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
17780 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
17790 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
177a0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
177b0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
177c0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
177d0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
177e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
177f0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
17800 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
17810 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
17820 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
17830 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
17840 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
17850 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
17860 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
17870 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
17880 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
17890 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
178a0 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
178b0 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
178c0 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
178d0 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
178e0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
178f0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
17900 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
17910 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
17920 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
17930 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  Y is in pExpr->p
17940 52 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73  Right.  The Y is
17950 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
17960 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   If there is no.
17970 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75      ** ELSE clau
17980 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  se and no other 
17990 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68  term matches, th
179a0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
179b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72   the.    ** expr
179c0 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20  ssion is NULL.. 
179d0 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
179e0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
179f0 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
17a00 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
17a10 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
17a20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
17a30 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
17a40 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
17a50 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
17a60 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
17a70 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
17a80 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
17a90 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
17aa0 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
17ab0 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
17ac0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
17ad0 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
17ae0 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
17af0 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
17b00 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
17b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
17b20 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
17b30 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
17b40 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
17b50 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
17b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
17b70 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
17b80 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
17b90 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
17bc0 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
17bd0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
17be0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
17c10 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
17c20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
17c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
17c40 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
17c50 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
17c60 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
17c70 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
17c80 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
17c90 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
17ca0 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17cc0 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
17cd0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
17ce0 72 20 63 61 63 68 65 58 3b 20 20 20 20 20 20 20  r cacheX;       
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d00 2a 20 43 61 63 68 65 64 20 65 78 70 72 65 73 73  * Cached express
17d10 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 45  ion X */.      E
17d20 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
17d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d40 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
17d50 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
17d60 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
17d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d80 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
17d90 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
17da0 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
17db0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
17dc0 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
17dd0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
17de0 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
17df0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
17e00 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17e10 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
17e20 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
17e30 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d    assert((pExpr-
17e40 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
17e50 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
17e60 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
17e70 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
17e80 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
17e90 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
17ea0 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
17eb0 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
17ec0 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
17ed0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
17ee0 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
17ef0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17f00 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
17f10 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
17f20 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
17f30 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70 58      cacheX = *pX
17f40 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17f50 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  se( pX->op==TK_C
17f60 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
17f70 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
17f80 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
17f90 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58  ;.        cacheX
17fa0 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
17fb0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17fc0 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72  arse, pX, &regFr
17fd0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ee1);.        te
17fe0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
17ff0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ==0 );.        c
18000 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45  acheX.op = TK_RE
18010 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20  GISTER;.        
18020 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
18030 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
18040 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
18050 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20  &cacheX;.       
18060 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
18070 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
18080 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
18090 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
180a0 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
180b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
180c0 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
180d0 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
180e0 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
180f0 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
18100 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
18110 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
18120 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
18130 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
18140 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
18150 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
18160 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
18170 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
18180 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
18190 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
181a0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d  i=0; i<nExpr; i=
181b0 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
181c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
181d0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
181e0 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
181f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18200 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
18210 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
18220 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
18230 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
18240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18250 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
18260 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
18270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18280 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
18290 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
182a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
182b0 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
182c0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
182d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
182e0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
182f0 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
18300 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
18310 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
18320 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
18330 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
18340 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
18350 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
18360 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
18370 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
18380 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
18390 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
183a0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
183b0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
183c0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
183d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
183e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
183f0 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  o, 0, endLabel);
18400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18410 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
18420 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rse, 1);.       
18430 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18440 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
18450 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
18460 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
18470 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
18480 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18490 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
184a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
184b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
184c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74  pExpr->pRight, t
184d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
184e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
184f0 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
18500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18520 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
18530 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
18540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
18550 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
18560 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
18570 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20  >nErr>0 .       
18580 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69      || pParse->i
18590 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63  CacheLevel==iCac
185a0 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20  heLevel );.     
185b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
185c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
185d0 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
185e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
185f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
18600 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
18610 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
18620 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
18630 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c  affinity==OE_Rol
18640 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20  lback .         
18650 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
18660 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20  nity==OE_Abort. 
18670 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
18680 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18690 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20  _Fail.          
186a0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
186b0 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  ity==OE_Ignore. 
186c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
186d0 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
186e0 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
186f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18700 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
18730 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
18740 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
18750 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
18760 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
18770 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
18780 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
18790 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
187a0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
187b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
187c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
187d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
187e0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
187f0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ue) );.      if(
18800 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18810 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
18820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18830 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
18840 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74        v, OP_Halt
18850 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f  , SQLITE_OK, OE_
18860 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72  Ignore, 0, pExpr
18870 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20  ->u.zToken,0);. 
18880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18890 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43      sqlite3HaltC
188a0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
188b0 2c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  , pExpr->affinit
188c0 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  y, pExpr->u.zTok
188d0 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  en, 0);.      }.
188e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
188f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
18900 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18910 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
18920 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
18930 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18940 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
18950 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
18960 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
18970 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
18980 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
18990 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
189a0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
189b0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
189c0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
189d0 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
189e0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
189f0 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
18a00 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
18a10 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
18a20 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
18a30 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
18a40 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
18a50 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
18a60 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
18a70 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
18a80 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
18a90 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
18aa0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
18ab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
18ac0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
18ad0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
18ae0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
18af0 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  ){.  int r1 = sq
18b00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
18b10 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
18b20 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
18b30 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
18b40 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
18b50 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
18b60 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
18b70 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
18b80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18b90 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
18ba0 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d    *pReg = 0;.  }
18bb0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
18bc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18bd0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
18be0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
18bf0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
18c00 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
18c10 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
18c20 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
18c30 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
18c40 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
18c50 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
18c60 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18c70 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
18c80 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
18c90 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
18ca0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
18cb0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
18cc0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
18cd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
18ce0 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
18cf0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
18d00 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
18d10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
18d20 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
18d30 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
18d40 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
18d50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
18d60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18d70 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
18d80 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
18d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18da0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
18db0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
18dc0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
18dd0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
18de0 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
18df0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18e00 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
18e10 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
18e20 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
18e30 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  et);.    }.  }. 
18e40 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
18e50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18e60 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
18e70 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
18e80 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75  xpression and pu
18e90 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ts the result.**
18ea0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
18eb0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  get..**.** Also 
18ec0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
18ed0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
18ee0 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
18ef0 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
18f00 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
18f10 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
18f20 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
18f30 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
18f40 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
18f50 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
18f60 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
18f70 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
18f80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
18f90 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
18fa0 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
18fb0 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
18fc0 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
18fd0 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
18fe0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
18ff0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
19000 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
19010 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
19020 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
19030 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
19040 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
19050 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
19060 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19070 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20  .  int inReg;.  
19080 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
19090 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
190a0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
190b0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
190c0 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20  >0 );.  /* This 
190d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
190e0 64 20 66 6f 72 20 74 65 72 6d 73 20 74 6f 20 49  d for terms to I
190f0 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 2e  NSERT or UPDATE.
19100 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a 20    And the only. 
19110 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63 65 20   ** other place 
19120 77 68 65 72 65 20 65 78 70 72 65 73 73 69 6f 6e  where expression
19130 73 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74  s can be convert
19140 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49 53  ed into TK_REGIS
19150 54 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20 57  TER is.  ** in W
19160 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
19170 65 73 73 69 6e 67 2e 20 20 53 6f 20 61 73 20 63  essing.  So as c
19180 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d 65  urrently impleme
19190 6e 74 65 64 2c 20 74 68 65 72 65 20 69 73 0a 20  nted, there is. 
191a0 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20 61   ** no way for a
191b0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 74 6f 20   TK_REGISTER to 
191c0 65 78 69 73 74 20 68 65 72 65 2e 20 20 42 75 74  exist here.  But
191d0 20 69 74 20 73 65 65 6d 73 20 70 72 75 64 65 6e   it seems pruden
191e0 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 74  t to.  ** keep t
191f0 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e 20 63  he ALWAYS() in c
19200 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ase the conditio
19210 6e 73 20 61 62 6f 76 65 20 63 68 61 6e 67 65 20  ns above change 
19220 77 69 74 68 20 66 75 74 75 72 65 0a 20 20 2a 2a  with future.  **
19230 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 6f   modifications o
19240 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e 20  r enhancements. 
19250 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
19260 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
19270 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20 20 20  GISTER) ){  .   
19280 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69   int iMem;.    i
19290 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
192a0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
192b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
192c0 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69  P_Copy, inReg, i
192d0 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  Mem);.    pExpr-
192e0 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a  >iTable = iMem;.
192f0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
19300 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
19310 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
19320 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72  EGISTER;.  }.  r
19330 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
19340 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19350 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
19360 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
19370 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
19380 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74  eadable explanat
19390 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ion of an expres
193a0 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
193b0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
193c0 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75 74  nExpr(Vdbe *pOut
193d0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
193e0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
193f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19400 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
19410 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  coded */.  const
19420 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20   char *zBinOp = 
19430 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f  0;   /* Binary o
19440 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e  perator */.  con
19450 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20  st char *zUniOp 
19460 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20  = 0;   /* Unary 
19470 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66  operator */.  if
19480 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
19490 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
194a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
194b0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
194c0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
194d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
194e0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
194f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19500 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47  rintf(pOut, "AGG
19510 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
19520 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
19530 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
19540 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
19550 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19560 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
19570 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
19580 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
19590 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
195a0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
195b0 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
195c0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
195d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
195e0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f  Printf(pOut, "CO
195f0 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72  LUMN(%d)", pExpr
19600 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
19610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19620 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19630 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25 64  rintf(pOut, "{%d
19640 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  :%d}",.         
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
19670 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
19680 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
19690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
196a0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
196b0 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
196c0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
196d0 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
196e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
196f0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19700 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
19710 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  iValue);.      }
19720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
19730 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19740 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c 20 70  tf(pOut, "%s", p
19750 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
19760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
19770 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
19780 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19790 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
197a0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
197b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
197c0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
197d0 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d  Out,"%s", pExpr-
197e0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
197f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19800 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
19810 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
19820 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19830 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 51 22  Printf(pOut,"%Q"
19840 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
19850 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
19860 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19870 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
19880 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19890 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c  rintf(pOut,"NULL
198a0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
198b0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
198c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
198d0 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
198e0 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
198f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19900 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22  Printf(pOut,"%s"
19910 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
19920 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
19930 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19940 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
19950 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
19960 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19970 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c 45 28  (pOut,"VARIABLE(
19980 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20  %s,%d)",.       
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199a0 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
199b0 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ken, pExpr->iCol
199c0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
199d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
199e0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
199f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19a00 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
19a10 2c 22 52 45 47 49 53 54 45 52 28 25 64 29 22 2c  ,"REGISTER(%d)",
19a20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
19a30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19a40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19a50 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AS: {.      sqli
19a60 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
19a70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
19a80 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
19a90 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
19aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
19ab0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
19ac0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
19ad0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
19ae0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
19af0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
19b00 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
19b10 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a   *zAff = "unk";.
19b20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
19b30 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
19b40 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
19b50 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  n) ){.        ca
19b60 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
19b70 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 54  XT:    zAff = "T
19b80 45 58 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  EXT";     break;
19b90 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
19ba0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20  LITE_AFF_NONE:  
19bb0 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45 22 3b    zAff = "NONE";
19bc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19bd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19be0 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a 41 66  AFF_NUMERIC: zAf
19bf0 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 20 20  f = "NUMERIC";  
19c00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
19c10 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  ase SQLITE_AFF_I
19c20 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d 20 22  NTEGER: zAff = "
19c30 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65 61 6b  INTEGER";  break
19c40 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
19c50 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 20  QLITE_AFF_REAL: 
19c60 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41 4c 22     zAff = "REAL"
19c70 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19c80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19c90 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19ca0 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73 28 22  pOut, "CAST-%s("
19cb0 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20 20 73  , zAff);.      s
19cc0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
19cd0 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
19ce0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
19cf0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19d00 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
19d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19d20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19d30 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
19d40 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
19d50 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54      zBinOp = "LT
19d60 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
19d70 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
19d80 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22     zBinOp = "LE"
19d90 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19da0 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
19db0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b    zBinOp = "GT";
19dc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19dd0 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
19de0 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20   zBinOp = "GE"; 
19df0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19e00 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
19e10 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20  zBinOp = "NE";  
19e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19e30 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
19e40 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20  BinOp = "EQ";   
19e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
19e60 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42  e TK_IS:      zB
19e70 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20  inOp = "IS";    
19e80 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19e90 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69   TK_ISNOT:   zBi
19ea0 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20  nOp = "ISNOT";  
19eb0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19ec0 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e  TK_AND:     zBin
19ed0 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62  Op = "AND";    b
19ee0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
19ef0 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_OR:      zBinO
19f00 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72  p = "OR";     br
19f10 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
19f20 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70  _PLUS:    zBinOp
19f30 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72 65   = "ADD";    bre
19f40 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
19f50 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20  STAR:    zBinOp 
19f60 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61  = "MUL";    brea
19f70 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
19f80 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  INUS:   zBinOp =
19f90 20 22 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b   "SUB";    break
19fa0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
19fb0 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  M:     zBinOp = 
19fc0 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b  "REM";    break;
19fd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
19fe0 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  AND:  zBinOp = "
19ff0 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a  BITAND"; break;.
1a000 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1a010 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42  R:   zBinOp = "B
1a020 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ITOR";  break;. 
1a030 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1a040 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49  :   zBinOp = "DI
1a050 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  V";    break;.  
1a060 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1a070 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48  :  zBinOp = "LSH
1a080 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IFT"; break;.   
1a090 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
1a0a0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49    zBinOp = "RSHI
1a0b0 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  FT"; break;.    
1a0c0 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1a0d0 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41   zBinOp = "CONCA
1a0e0 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  T"; break;..    
1a0f0 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1a100 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55   zUniOp = "UMINU
1a110 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  S"; break;.    c
1a120 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
1a130 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53 22  zUniOp = "UPLUS"
1a140 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1a150 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
1a160 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22  UniOp = "BITNOT"
1a170 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1a180 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55  e TK_NOT:     zU
1a190 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20  niOp = "NOT";   
1a1a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a1b0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e   TK_ISNULL:  zUn
1a1c0 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  iOp = "ISNULL"; 
1a1d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a1e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69  TK_NOTNULL: zUni
1a1f0 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
1a200 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
1a210 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1a220 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1a230 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
1a240 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1a250 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1a260 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1a270 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1a280 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1a290 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1a2a0 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
1a2b0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1a2c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
1a2d0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
1a2e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
1a2f0 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
1a300 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1a310 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a320 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
1a330 73 46 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 0a  sFUNCTION:%s(",.
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 54             op==T
1a360 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 3f  K_AGG_FUNCTION ?
1a370 20 22 41 47 47 5f 22 20 3a 20 22 22 2c 0a 20 20   "AGG_" : "",.  
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a390 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1a3a0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1a3b0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
1a3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a3d0 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75  lainExprList(pOu
1a3e0 74 2c 20 70 46 61 72 67 29 3b 0a 20 20 20 20 20  t, pFarg);.     
1a3f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a400 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a410 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20  ut, ")");.      
1a420 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1a430 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a440 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1a450 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a  se TK_EXISTS: {.
1a460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a470 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a480 20 22 45 58 49 53 54 53 28 22 29 3b 0a 20 20 20   "EXISTS(");.   
1a490 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a4a0 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45  nSelect(pOut, pE
1a4b0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
1a4c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a4d0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a4e0 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ,")");.      bre
1a4f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a500 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
1a510 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a520 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a530 20 22 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   "(");.      sql
1a540 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63  ite3ExplainSelec
1a550 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78  t(pOut, pExpr->x
1a560 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
1a570 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a580 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1a590 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a5a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a5b0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _IN: {.      sql
1a5c0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a5d0 66 28 70 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a  f(pOut, "IN(");.
1a5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a5f0 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1a600 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1a610 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a620 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1a630 2c 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ,");.      if( E
1a640 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1a650 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1a660 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ct) ){.        s
1a670 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
1a680 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ect(pOut, pExpr-
1a690 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
1a6a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a6b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a6c0 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70  ExprList(pOut, p
1a6d0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
1a6e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a6f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a700 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1a710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a720 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1a730 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a740 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
1a750 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
1a760 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
1a770 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
1a780 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
1a790 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
1a7a0 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
1a7b0 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
1a7c0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
1a7d0 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
1a7e0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1a7f0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
1a800 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
1a810 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1a820 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
1a830 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
1a840 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1a850 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1a860 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
1a870 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
1a880 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Y = pExpr->x.pLi
1a890 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1a8a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d        Expr *pZ =
1a8b0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1a8c0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
1a8d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a8e0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 42  nPrintf(pOut, "B
1a8f0 45 54 57 45 45 4e 28 22 29 3b 0a 20 20 20 20 20  ETWEEN(");.     
1a900 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1a910 78 70 72 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20  xpr(pOut, pX);. 
1a920 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a930 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a940 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1a950 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1a960 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20 20 20 20  Out, pY);.      
1a970 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1a980 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b  intf(pOut, ",");
1a990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a9a0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1a9b0 70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pZ);.      sqlit
1a9c0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a9d0 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1a9e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a9f0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
1aa00 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
1aa10 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
1aa20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
1aa30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1aa40 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
1aa50 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
1aa60 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
1aa70 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
1aa80 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
1aa90 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
1aaa0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
1aab0 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
1aac0 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
1aad0 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
1aae0 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
1aaf0 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
1ab00 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
1ab10 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
1ab20 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
1ab30 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
1ab40 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
1ab50 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
1ab60 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
1ab70 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
1ab80 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
1ab90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1aba0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1abb0 66 28 70 4f 75 74 2c 20 22 25 73 28 25 64 29 22  f(pOut, "%s(%d)"
1abc0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  , .          pEx
1abd0 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45  pr->iTable ? "NE
1abe0 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70  W" : "OLD", pExp
1abf0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1ac00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ac10 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45      case TK_CASE
1ac20 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1ac30 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ac40 4f 75 74 2c 20 22 43 41 53 45 28 22 29 3b 0a 20  Out, "CASE(");. 
1ac50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ac60 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1ac70 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1ac80 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ac90 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1aca0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1acb0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
1acc0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1acd0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72  pList);.      br
1ace0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1acf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1ad00 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1ad10 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1ad20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1ad30 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20  ype = "unk";.   
1ad40 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72     switch( pExpr
1ad50 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20  ->affinity ){.  
1ad60 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
1ad70 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20  llback:   zType 
1ad80 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62  = "rollback";  b
1ad90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1ada0 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20  se OE_Abort:    
1adb0 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74    zType = "abort
1adc0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1add0 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61        case OE_Fa
1ade0 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20  il:       zType 
1adf0 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62  = "fail";      b
1ae00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1ae10 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20  se OE_Ignore:   
1ae20 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72    zType = "ignor
1ae30 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e";    break;.  
1ae40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ae50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ae60 28 70 4f 75 74 2c 20 22 52 41 49 53 45 2d 25 73  (pOut, "RAISE-%s
1ae70 28 25 73 29 22 2c 20 7a 54 79 70 65 2c 20 70 45  (%s)", zType, pE
1ae80 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1ae90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aea0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1aeb0 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20  if( zBinOp ){.  
1aec0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1aed0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28  Printf(pOut,"%s(
1aee0 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20  ", zBinOp);.    
1aef0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1af00 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1af10 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
1af20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1af30 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20  (pOut,",");.    
1af40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1af50 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1af60 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  pRight);.    sql
1af70 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1af80 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d  f(pOut,")");.  }
1af90 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20  else if( zUniOp 
1afa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1afb0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1afc0 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b  ,"%s(", zUniOp);
1afd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1afe0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1aff0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1b000 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b010 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b  rintf(pOut,")");
1b020 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1b030 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b040 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
1b050 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  AIN) */..#if def
1b060 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1b070 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
1b080 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b090 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
1b0a0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
1b0b0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
1b0c0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1b0d0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1b0e0 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45  st(Vdbe *pOut, E
1b0f0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1b100 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b110 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
1b120 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20  t->nExpr==0 ){. 
1b130 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b140 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28  nPrintf(pOut, "(
1b150 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20  empty-list)");. 
1b160 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
1b170 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  se if( pList->nE
1b180 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  xpr==1 ){.    sq
1b190 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b1a0 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  (pOut, pList->a[
1b1b0 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c  0].pExpr);.  }el
1b1c0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1b1d0 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29  xplainPush(pOut)
1b1e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1b1f0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1b200 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1b210 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b220 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20  pOut, "item[%d] 
1b230 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  = ", i);.      s
1b240 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
1b250 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 73  h(pOut);.      s
1b260 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b270 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61  r(pOut, pList->a
1b280 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1b290 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b2a0 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  Pop(pOut);.     
1b2b0 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45   if( i<pList->nE
1b2c0 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  xpr-1 ){.       
1b2d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
1b2e0 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d  L(pOut);.      }
1b2f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b300 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75  e3ExplainPop(pOu
1b310 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  t);.  }.}.#endif
1b320 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1b330 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
1b340 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72 20  n TRUE if pExpr 
1b350 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65  is an constant e
1b360 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
1b370 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  s appropriate.**
1b380 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f   for factoring o
1b390 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41  ut of a loop.  A
1b3a0 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72 65  ppropriate expre
1b3b0 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ssions are:.**.*
1b3c0 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72  *    *  Any expr
1b3d0 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c  ession that eval
1b3e0 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20  uates to two or 
1b3f0 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a  more opcodes..**
1b400 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50  .**    *  Any OP
1b410 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61  _Integer, OP_Rea
1b420 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50  l, OP_String, OP
1b430 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  _Blob, OP_Null, 
1b440 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f  .**       or OP_
1b450 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f  Variable that do
1b460 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1b470 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a  e placed in a .*
1b480 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63  *       specific
1b490 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
1b4a0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
1b4b0 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20  nt in factoring 
1b4c0 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72  out single-instr
1b4d0 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a  uction constant.
1b4e0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
1b4f0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  hat need to be p
1b500 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74 69  laced in a parti
1b510 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20  cular register. 
1b520 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61   .** We could fa
1b530 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62  ctor them out, b
1b540 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64  ut then we would
1b550 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61   end up adding a
1b560 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e  n.** OP_SCopy in
1b570 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76  struction to mov
1b580 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  e the value into
1b590 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 67   the correct reg
1b5a0 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20  ister.** later. 
1b5b0 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
1b5c0 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f  l just use the o
1b5d0 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74  riginal instruct
1b5e0 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64  ion and.** avoid
1b5f0 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a   the OP_SCopy..*
1b600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
1b610 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
1b620 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b  toring(Expr *p){
1b630 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
1b640 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
1b650 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72  Join(p) ){.    r
1b660 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c  eturn 0;  /* Onl
1b670 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  y constant expre
1b680 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f  ssions are appro
1b690 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f  priate for facto
1b6a0 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ring */.  }.  if
1b6b0 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
1b6c0 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29  _FixedDest)==0 )
1b6d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  {.    return 1; 
1b6e0 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74   /* Any constant
1b6f0 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65 64   without a fixed
1b700 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
1b710 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20  appropriate */. 
1b720 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f   }.  while( p->o
1b730 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20  p==TK_UPLUS ) p 
1b740 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77  = p->pLeft;.  sw
1b750 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23  itch( p->op ){.#
1b760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b770 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
1b780 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
1b790 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
1b7a0 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
1b7b0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
1b7c0 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
1b7d0 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
1b7e0 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  TK_NULL:.    cas
1b7f0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1b800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b810 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b  ->op==TK_BLOB );
1b820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b830 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41   p->op==TK_VARIA
1b840 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BLE );.      tes
1b850 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1b860 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
1b870 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
1b880 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20  p==TK_FLOAT );. 
1b890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b8a0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b  ->op==TK_NULL );
1b8b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b8c0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
1b8d0 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69  G );.      /* Si
1b8e0 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
1b8f0 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   constants with 
1b900 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
1b910 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ion are.      **
1b920 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d   better done in-
1b930 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63  line.  If we fac
1b940 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77  tor them, they w
1b950 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20  ill just end.   
1b960 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74     ** up generat
1b970 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20  ing an OP_SCopy 
1b980 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
1b990 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61  e to the destina
1b9a0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65  tion.      ** re
1b9b0 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gister. */.     
1b9c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1b9d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
1b9e0 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NUS: {.      if(
1b9f0 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
1ba00 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c  K_FLOAT || p->pL
1ba10 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1ba20 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72  GER ){.        r
1ba30 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1ba40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba50 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
1ba60 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   {.      break;.
1ba70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ba80 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
1ba90 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
1baa0 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1bab0 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
1bac0 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74  iate for.** fact
1bad0 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c  oring out of a l
1bae0 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  oop, then evalua
1baf0 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
1bb00 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  n.** into a regi
1bb10 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ster and convert
1bb20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1bb30 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  into a TK_REGIST
1bb40 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ER.** expression
1bb50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bb60 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57 61  evalConstExpr(Wa
1bb70 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
1bb80 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 50  xpr *pExpr){.  P
1bb90 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1bba0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1bbb0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1bbc0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1bbd0 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20  TK_IN:.    case 
1bbe0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
1bbf0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1bc00 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
1bc10 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
1bc20 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
1bc30 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
1bc40 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
1bc50 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UNC: {.      /* 
1bc60 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
1bc70 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65   a function have
1bc80 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
1bc90 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  tion..      ** M
1bca0 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61  ark them this wa
1bcb0 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72  y to avoid gener
1bcc0 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50  ated unneeded OP
1bcd0 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  _SCopy.      ** 
1bce0 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20  instructions. . 
1bcf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
1bd00 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
1bd10 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1bd20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1bd30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1bd40 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1bd50 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
1bd60 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
1bd70 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
1bd80 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
1bd90 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1bda0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c  item *pItem = pL
1bdb0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
1bdc0 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  for(; i>0; i--, 
1bdd0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1bde0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
1bdf0 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20 70  Item->pExpr) ) p
1be00 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61  Item->pExpr->fla
1be10 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65  gs |= EP_FixedDe
1be20 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  st;.        }.  
1be30 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1be40 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1be50 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  f( isAppropriate
1be60 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78  ForFactoring(pEx
1be70 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  pr) ){.    int r
1be80 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
1be90 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a  em;.    int r2;.
1bea0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1beb0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1bec0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
1bed0 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
1bee0 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c 69 74  (r1!=r2) ) sqlit
1bef0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1bf00 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
1bf10 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70    pExpr->op2 = p
1bf20 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
1bf30 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
1bf40 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72  ISTER;.    pExpr
1bf50 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20  ->iTable = r2;. 
1bf60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1bf70 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
1bf80 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1bf90 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c  }../*.** Preeval
1bfa0 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75  uate constant su
1bfb0 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74  bexpressions wit
1bfc0 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  hin pExpr and st
1bfd0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1bfe0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e  ts in registers.
1bff0 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73    Modify pExpr s
1c000 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  o that the const
1c010 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e  ant subexpresion
1c020 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49  s.** are TK_REGI
1c030 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61  STER opcodes tha
1c040 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 70  t refer to the p
1c050 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65  recomputed value
1c060 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1c070 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1c080 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f 20   if the jump to 
1c090 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b  the cookie-check
1c0a0 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c 72   code has.** alr
1c0b0 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69 6e  eady occur.  Sin
1c0c0 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68  ce the cookie-ch
1c0d0 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e 65  eck jump is gene
1c0e0 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a 2a  rated prior to.*
1c0f0 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72 69  * any other seri
1c100 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c 20  ous processing, 
1c110 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75 72  this check ensur
1c120 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
1c130 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61 63   no.** way to ac
1c140 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73 20  cidently bypass 
1c150 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 69  the constant ini
1c160 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a 2a  tializations..**
1c170 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c180 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f 70   is also a no-op
1c190 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 46   if the SQLITE_F
1c1a0 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f 70  actorOutConst op
1c1b0 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73  timization.** is
1c1c0 20 64 69 73 61 62 6c 65 64 20 76 69 61 20 74 68   disabled via th
1c1d0 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  e sqlite3_test_c
1c1e0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c1f0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
1c200 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66 61  IONS).** interfa
1c210 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ce.  This allows
1c220 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20 76   test logic to v
1c230 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
1c240 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a 2a  ame answer is.**
1c250 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71 75   obtained for qu
1c260 65 72 69 65 73 20 72 65 67 61 72 64 6c 65 73 73  eries regardless
1c270 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
1c280 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  ot constants are
1c290 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64 20  .** precomputed 
1c2a0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 6f  into registers o
1c2b0 72 20 69 66 20 74 68 65 79 20 61 72 65 20 69 6e  r if they are in
1c2c0 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e 0a  serted in-line..
1c2d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c2e0 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
1c2f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c300 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1c310 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28 20  Walker w;.  if( 
1c320 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1c330 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  to ) return;.  i
1c340 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
1c350 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
1c360 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 21 3d  actorOutConst)!=
1c370 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 2e  0 ) return;.  w.
1c380 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1c390 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20  evalConstExpr;. 
1c3a0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1c3b0 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72  ck = 0;.  w.pPar
1c3c0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
1c3d0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
1c3e0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f  w, pExpr);.}.../
1c3f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c400 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
1c410 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
1c420 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
1c430 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1c440 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
1c450 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
1c460 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
1c470 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
1c480 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1c490 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1c4a0 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e  evaluated..*/.in
1c4b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1c4c0 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
1c4d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1c4e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1c4f0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
1c500 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
1c510 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
1c520 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
1c530 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
1c540 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1c550 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
1c560 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43  */.  int doHardC
1c570 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  opy     /* Make 
1c580 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65  a hard copy of e
1c590 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  very element */.
1c5a0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
1c5b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c5c0 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
1c5d0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
1c5e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
1c5f0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
1c600 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
1c610 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
1c620 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
1c630 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
1c640 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1c650 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1c660 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b  st->a, i=0; i<n;
1c670 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1c680 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1c690 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
1c6a0 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
1c6b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1c6c0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1c6d0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
1c6e0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1c6f0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
1c700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c710 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1c720 2c 20 64 6f 48 61 72 64 43 6f 70 79 20 3f 20 4f  , doHardCopy ? O
1c730 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
1c740 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1c750 20 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67             inReg
1c760 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
1c770 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c780 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
1c790 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1c7a0 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
1c7b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
1c7c0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
1c7d0 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
1c7e0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
1c7f0 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
1c800 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
1c810 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
1c820 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
1c830 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
1c840 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65  ression.** eleme
1c850 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f  ntation of x..*/
1c860 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1c870 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20  rCodeBetween(.  
1c880 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c890 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1c8a0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1c8b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1c8c0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
1c8d0 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65  /* The BETWEEN e
1c8e0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1c8f0 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1c900 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1c910 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
1c920 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  en */.  int jump
1c930 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b  IfTrue,   /* Tak
1c940 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1c950 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75  e BETWEEN is tru
1c960 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
1c970 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
1c980 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1c990 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
1c9a0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78   */.){.  Expr ex
1c9b0 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
1c9c0 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
1c9d0 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
1c9e0 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
1c9f0 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
1ca00 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
1ca10 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
1ca20 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
1ca30 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
1ca40 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
1ca50 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
1ca60 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
1ca70 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
1ca80 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
1ca90 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  gister */..  ass
1caa0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1cab0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1cac0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1cad0 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
1cae0 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1caf0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1cb00 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
1cb10 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
1cb20 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
1cb30 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
1cb40 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
1cb50 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
1cb60 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1cb70 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
1cb80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1cb90 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
1cba0 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
1cbb0 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
1cbc0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1cbd0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
1cbe0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
1cbf0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
1cc00 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20  .  exprX.iTable 
1cc10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1cc20 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1cc30 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1cc40 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54  ;.  exprX.op = T
1cc50 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 69 66  K_REGISTER;.  if
1cc60 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a  ( jumpIfTrue ){.
1cc70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1cc80 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
1cc90 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1cca0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
1ccb0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1ccc0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1ccd0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1cce0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ccf0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1cd00 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1cd10 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a  se, regFree1);..
1cd20 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71    /* Ensure adeq
1cd30 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61  uate test covera
1cd40 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ge */.  testcase
1cd50 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1cd60 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1cd70 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1cd80 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1cd90 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1cda0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1cdb0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1cdc0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1cdd0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1cde0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1cdf0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1ce00 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1ce10 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1ce20 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1ce30 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1ce40 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1ce50 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1ce60 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1ce70 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1ce80 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1ce90 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1cea0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1ceb0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1cec0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1ced0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1cee0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1cef0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1cf00 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1cf10 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1cf20 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a  egFree1!=0 );.}.
1cf30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cf40 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1cf50 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1cf60 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1cf70 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1cf80 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1cf90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1cfa0 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
1cfb0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
1cfc0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
1cfd0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1cfe0 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
1cff0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1d000 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1d010 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1d020 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
1d030 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
1d040 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
1d050 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
1d060 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1d070 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
1d080 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1d090 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
1d0a0 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
1d0b0 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
1d0c0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
1d0d0 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
1d0e0 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
1d0f0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
1d100 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
1d110 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
1d120 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
1d130 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
1d140 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
1d150 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
1d160 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
1d170 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
1d180 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
1d190 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
1d1a0 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
1d1b0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
1d1c0 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
1d1d0 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
1d1e0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1d1f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1d200 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1d210 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
1d220 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
1d230 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1d240 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
1d250 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1d260 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1d270 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
1d280 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
1d290 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
1d2a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
1d2b0 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
1d2c0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
1d2d0 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72  ==0) )     retur
1d2e0 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63 65  n;  /* Existance
1d2f0 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
1d300 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
1d310 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
1d320 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
1d330 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61  * No way this ca
1d340 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70  n happen */.  op
1d350 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1d360 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1d370 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1d380 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1d390 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1d3a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1d3b0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1d3c0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1d3d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d3e0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1d3f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1d400 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1d410 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
1d420 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1d430 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1d440 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d450 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1d460 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1d470 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d490 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1d4a0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
1d4b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1d4c0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
1d4d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d4e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1d4f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1d500 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1d510 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d520 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1d530 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d540 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1d550 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1d560 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1d570 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1d580 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1d590 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1d5a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d5b0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1d5c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d5d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1d5e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1d5f0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1d600 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1d610 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1d620 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d630 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1d640 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1d650 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1d660 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1d670 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1d680 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1d690 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1d6a0 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
1d6b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d6c0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
1d6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1d6e0 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
1d6f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
1d700 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
1d710 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
1d720 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
1d730 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
1d740 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
1d750 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1d760 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1d770 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
1d780 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d790 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
1d7a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d7b0 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
1d7c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1d7d0 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
1d7e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1d7f0 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
1d800 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1d810 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1d820 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d830 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1d840 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1d850 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1d860 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d870 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1d880 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1d890 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1d8a0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1d8b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1d8c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1d8d0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1d8e0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1d8f0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d910 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1d920 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d930 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1d940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d950 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1d960 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1d970 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1d980 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1d990 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1d9a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
1d9b0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1d9c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d9d0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d9e0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1d9f0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1da00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1da10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1da20 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1da30 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
1da40 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1da50 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1da60 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1da70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1da80 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1da90 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1dab0 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1dac0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1dad0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1dae0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1daf0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1db00 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1db10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1db20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1db30 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1db40 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
1db50 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1db60 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
1db70 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1db80 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1db90 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
1dba0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1dbb0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
1dbc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1dbd0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1dbe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dbf0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1dc00 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1dc10 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1dc20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dc30 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1dc40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1dc50 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1dc60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dc70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dc80 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1dc90 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1dca0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1dcb0 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1dcc0 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1dcd0 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49  , dest, 1, jumpI
1dce0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1dcf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1dd00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1dd10 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1dd20 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1dd30 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
1dd40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1dd50 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1dd60 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1dd70 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
1dd80 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
1dd90 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
1dda0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1ddb0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
1ddc0 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
1ddd0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1dde0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ddf0 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
1de00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1de10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1de20 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1de30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1de40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1de50 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1de60 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1de70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1de80 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1de90 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1dea0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1deb0 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
1dec0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1ded0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dee0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1def0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1df00 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1df10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1df20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1df30 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1df40 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1df50 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1df60 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1df70 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
1df80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1df90 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1dfa0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1dfb0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1dfc0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1dfd0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1dfe0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1dff0 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
1e000 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1e010 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1e020 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1e030 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
1e040 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1e050 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1e060 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1e070 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1e080 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
1e090 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
1e0a0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1e0b0 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
1e0c0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
1e0d0 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
1e0e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1e0f0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1e100 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1e110 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1e120 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1e130 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1e140 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1e150 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1e160 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1e170 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1e180 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1e190 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1e1a0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1e1b0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1e1c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1e1d0 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
1e1e0 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f  ; /* Existance o
1e1f0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
1e200 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
1e210 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
1e220 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
1e230 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
1e240 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
1e250 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
1e260 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1e270 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
1e280 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
1e290 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
1e2a0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
1e2b0 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
1e2c0 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
1e2d0 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
1e2e0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
1e2f0 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
1e300 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
1e310 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
1e320 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
1e330 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
1e340 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
1e350 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
1e360 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
1e370 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1e380 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1e390 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
1e3a0 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
1e3b0 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
1e3c0 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
1e3d0 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
1e3e0 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
1e3f0 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
1e400 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
1e410 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
1e420 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
1e430 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
1e440 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
1e450 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
1e460 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
1e470 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
1e480 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
1e490 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
1e4a0 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
1e4b0 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
1e4c0 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
1e4d0 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
1e4e0 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
1e4f0 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
1e500 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
1e510 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
1e520 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
1e530 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
1e540 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
1e550 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1e560 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
1e570 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
1e580 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
1e590 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1e5a0 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
1e5b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
1e5c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1e5d0 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
1e5e0 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
1e5f0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1e600 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
1e610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1e620 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
1e630 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
1e640 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1e650 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
1e660 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
1e670 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1e680 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
1e690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1e6a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
1e6b0 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
1e6c0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1e6d0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1e6e0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
1e6f0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1e700 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1e710 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1e720 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1e730 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1e740 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e750 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e760 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1e770 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1e780 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e7a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1e7b0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
1e7c0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1e7d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1e7e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1e7f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1e800 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e810 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1e820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e830 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1e840 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e850 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
1e860 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1e870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e880 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1e890 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1e8a0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1e8b0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1e8c0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e8d0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1e8e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e8f0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1e900 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e910 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e920 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1e930 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e940 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1e950 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1e960 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e970 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1e980 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e990 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e9a0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1e9b0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1e9c0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1e9d0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1e9e0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1e9f0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1ea00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ea10 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
1ea20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ea30 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
1ea40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ea50 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
1ea60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
1ea70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ea80 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
1ea90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eaa0 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
1eab0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1eac0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ead0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1eae0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1eaf0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1eb00 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1eb10 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1eb20 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eb30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1eb40 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1eb50 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1eb60 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1eb70 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1eb80 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1eba0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1ebb0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
1ebc0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ebd0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1ebe0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1ebf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1ec00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ec10 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1ec20 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1ec30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ec40 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1ec50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ec60 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1ec70 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1ec80 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ec90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1eca0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ecb0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ecc0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ecd0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ece0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ecf0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1ed00 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
1ed10 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1ed20 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
1ed30 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1ed40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ed50 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1ed60 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1ed70 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1ed80 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1ed90 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1eda0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1edb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1edc0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1edd0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1ede0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1edf0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1ee00 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1ee10 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ee20 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1ee30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ee40 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1ee50 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
1ee60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ee70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ee80 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ee90 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1eea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1eeb0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
1eec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1eed0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1eee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1eef0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1ef00 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1ef10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1ef20 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ef30 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1ef40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ef50 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  dest, 0, jumpIfN
1ef60 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1ef70 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1ef80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1ef90 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
1efa0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
1efb0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
1efc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1efd0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1efe0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
1eff0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
1f000 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
1f010 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1f020 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f030 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1f040 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1f050 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1f060 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
1f070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f080 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f090 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
1f0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1f0b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1f0c0 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1f0d0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
1f0e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f0f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f100 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f110 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f120 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
1f130 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
1f140 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
1f150 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f160 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f170 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f180 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f190 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f1a0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1f1b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1f1c0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1f1d0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1f1e0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1f1f0 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
1f200 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
1f210 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
1f220 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
1f230 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
1f240 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
1f250 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
1f260 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
1f270 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
1f280 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
1f290 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
1f2a0 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
1f2b0 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
1f2c0 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
1f2d0 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
1f2e0 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
1f2f0 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
1f300 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  rator..**.** Som
1f310 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
1f320 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1f330 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
1f340 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
1f350 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
1f360 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
1f370 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
1f380 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1f390 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
1f3a0 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
1f3b0 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
1f3c0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
1f3d0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
1f3e0 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
1f3f0 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
1f400 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
1f410 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1f420 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1f430 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
1f440 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
1f450 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
1f460 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
1f470 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
1f480 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
1f490 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
1f4a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f4b0 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
1f4c0 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
1f4d0 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
1f4e0 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
1f4f0 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
1f500 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
1f510 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
1f520 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
1f530 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
1f540 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
1f550 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1f560 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1f570 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
1f580 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41 3d 3d  *pB){.  if( pA==
1f590 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
1f5a0 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
1f5b0 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 2;.  }.  ass
1f5c0 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1f5d0 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1f5e0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1f5f0 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72  uced) );.  asser
1f600 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1f610 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f  operty(pB, EP_To
1f620 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1f630 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70  ed) );.  if( Exp
1f640 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
1f650 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c   EP_xIsSelect) |
1f660 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
1f670 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pB, EP_xIsSele
1f680 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
1f690 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 2;.  }.  if( (
1f6a0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
1f6b0 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
1f6c0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
1f6d0 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
1f6e0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
1f6f0 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 32 3b  ->op ) return 2;
1f700 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1f710 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1f720 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
1f730 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1f740 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1f750 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1f760 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1f770 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1f780 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1f790 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
1f7a0 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 29 20  t, pB->x.pList) 
1f7b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1f7c0 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
1f7d0 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
1f7e0 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
1f7f0 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
1f800 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1f810 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e  operty(pA, EP_In
1f820 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69  tValue) ){.    i
1f830 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1f840 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1f850 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56  lue) || pA->u.iV
1f860 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue!=pB->u.iVal
1f870 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
1f880 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 2;.    }.  }e
1f890 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  lse if( pA->op!=
1f8a0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
1f8b0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
1f8c0 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
1f8d0 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  en ){.    if( Ex
1f8e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1f8f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
1f900 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54  | NEVER(pB->u.zT
1f910 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75 72  oken==0) ) retur
1f920 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 74 72  n 2;.    if( str
1f930 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  cmp(pA->u.zToken
1f940 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
1f950 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1f960 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
1f970 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
1f980 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
1f990 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
1f9a0 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 20  P_ExpCollate) ) 
1f9b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1f9c0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1f9d0 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20 26  ExpCollate)!=0 &
1f9e0 26 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d  & pA->pColl!=pB-
1f9f0 3e 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20  >pColl ) return 
1fa00 32 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  2;.  return 0;.}
1fa10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1fa20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
1fa30 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
1fa40 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
1fa50 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
1fa60 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
1fa70 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
1fa80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1fa90 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
1faa0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
1fab0 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
1fac0 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
1fad0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
1fae0 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
1faf0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
1fb00 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
1fb10 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
1fb20 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
1fb30 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
1fb40 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
1fb50 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
1fb60 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
1fb70 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
1fb80 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
1fb90 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
1fba0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
1fbb0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
1fbc0 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
1fbd0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
1fbe0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1fbf0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
1fc00 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
1fc10 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
1fc20 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  B){.  int i;.  i
1fc30 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
1fc40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1fc50 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
1fc60 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1fc70 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
1fc80 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
1fc90 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
1fca0 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
1fcb0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1fcc0 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
1fcd0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
1fce0 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
1fcf0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
1fd00 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
1fd10 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
1fd20 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
1fd30 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
1fd40 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1fd50 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20  pExprA, pExprB) 
1fd60 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1fd70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1fd80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
1fd90 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c   expression call
1fda0 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74 65 33  back for sqlite3
1fdb0 46 75 6e 63 74 69 6f 6e 55 73 65 73 4f 74 68 65  FunctionUsesOthe
1fdc0 72 53 72 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 44 65  rSrc()..**.** De
1fdd0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78  termine if an ex
1fde0 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e  pression referen
1fdf0 63 65 73 20 61 6e 79 20 74 61 62 6c 65 20 6f 74  ces any table ot
1fe00 68 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  her than one of 
1fe10 74 68 65 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e  the.** tables in
1fe20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
1fe30 4c 69 73 74 20 61 6e 64 20 61 62 6f 72 74 20 69  List and abort i
1fe40 66 20 69 74 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  f it does..*/.st
1fe50 61 74 69 63 20 69 6e 74 20 65 78 70 72 55 73 65  atic int exprUse
1fe60 73 4f 74 68 65 72 53 72 63 28 57 61 6c 6b 65 72  sOtherSrc(Walker
1fe70 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
1fe80 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
1fe90 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1fea0 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  UMN || pExpr->op
1feb0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1fec0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1fed0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
1fee0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
1fef0 63 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  cList;.    for(i
1ff00 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
1ff10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1ff20 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
1ff30 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
1ff40 73 6f 72 20 29 20 72 65 74 75 72 6e 20 57 52 43  sor ) return WRC
1ff50 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d  _Continue;.    }
1ff60 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1ff70 41 62 6f 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Abort;.  }else{.
1ff80 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
1ff90 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a  ontinue;.  }.}..
1ffa0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
1ffb0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
1ffc0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
1ffd0 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
1ffe0 66 65 72 65 6e 63 65 73 0a 2a 2a 20 61 6e 79 20  ferences.** any 
1fff0 53 72 63 4c 69 73 74 20 6f 74 68 65 72 20 74 68  SrcList other th
20000 61 6e 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  an pSrcList.  Re
20010 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
20020 79 20 64 6f 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  y do.  Return.**
20030 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 20   false if pExpr 
20040 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 20  has no argument 
20050 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
20060 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 6f  tant arguments o
20070 72 0a 2a 2a 20 6f 6e 6c 79 20 72 65 66 65 72 65  r.** only refere
20080 6e 63 65 73 20 74 61 62 6c 65 73 20 6e 61 6d 65  nces tables name
20090 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a  d in pSrcList..*
200a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
200b0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
200c0 4f 74 68 65 72 53 72 63 28 45 78 70 72 20 2a 70  OtherSrc(Expr *p
200d0 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70  Expr, SrcList *p
200e0 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b  SrcList){.  Walk
200f0 65 72 20 77 3b 0a 20 20 61 73 73 65 72 74 28 20  er w;.  assert( 
20100 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
20110 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
20120 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
20130 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
20140 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
20150 70 72 55 73 65 73 4f 74 68 65 72 53 72 63 3b 0a  prUsesOtherSrc;.
20160 20 20 77 2e 75 2e 70 53 72 63 4c 69 73 74 20 3d    w.u.pSrcList =
20170 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 69 66 28   pSrcList;.  if(
20180 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
20190 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
201a0 78 2e 70 4c 69 73 74 29 21 3d 57 52 43 5f 43 6f  x.pList)!=WRC_Co
201b0 6e 74 69 6e 75 65 20 29 20 72 65 74 75 72 6e 20  ntinue ) return 
201c0 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
201d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
201e0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
201f0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
20200 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
20210 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
20220 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
20230 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
20240 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
20250 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
20260 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
20270 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
20280 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
20290 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
202a0 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
202b0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
202c0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
202d0 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
202e0 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
202f0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
20300 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
20310 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
20320 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
20330 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
20340 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
20350 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
20360 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
20370 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
20380 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
20390 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
203a0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
203b0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
203c0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
203d0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
203e0 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
203f0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
20400 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
20410 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
20420 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
20430 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
20440 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
20450 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
20460 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
20470 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
20480 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
20490 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
204a0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
204b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
204c0 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
204d0 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
204e0 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
204f0 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
20500 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
20510 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
20520 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
20530 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
20540 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
20550 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
20560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
20570 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
20580 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
20590 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
205a0 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
205b0 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
205c0 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
205d0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
205e0 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
205f0 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
20600 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
20610 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
20620 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
20630 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
20640 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
20650 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
20660 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
20670 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
20680 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
20690 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
206a0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
206b0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
206c0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
206d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
206e0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
206f0 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
20700 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
20710 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
20720 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
20730 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
20740 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
20750 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
20760 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
20770 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20780 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
20790 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
207a0 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
207b0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
207c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
207d0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
207e0 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
207f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
20800 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
20810 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
20820 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
20830 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
20840 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
20850 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
20860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
20870 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
20880 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
20890 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
208a0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
208b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
208c0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
208d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
208e0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
208f0 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
20900 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
20910 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
20920 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
20930 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
20940 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
20950 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
20960 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
20970 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
20980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
20990 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
209a0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
209b0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
209c0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
209d0 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
209e0 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
209f0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
20a00 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
20a10 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
20a20 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
20a30 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
20a40 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
20a50 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
20a60 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
20a70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20a80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
20a90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
20aa0 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
20ab0 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
20ac0 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
20ad0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
20ae0 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
20af0 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
20b00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20b10 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
20b20 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
20b40 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
20b50 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
20b60 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
20b70 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
20b80 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
20b90 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
20ba0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
20bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20bc0 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
20bd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
20be0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
20bf0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
20c00 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
20c10 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
20c20 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
20c30 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
20c40 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c60 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
20c70 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
20c80 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
20c90 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
20cb0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
20cc0 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
20cd0 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
20ce0 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
20cf0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
20d00 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
20d10 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
20d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d30 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
20d40 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20d60 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
20d70 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
20d80 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
20d90 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
20da0 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
20db0 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
20dc0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
20de0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
20df0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
20e00 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
20e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20e20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20e50 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
20e60 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
20e70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
20e80 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
20e90 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
20ea0 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
20eb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
20ec0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
20ed0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
20ee0 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
20ef0 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
20f00 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
20f10 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
20f20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
20f30 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
20f40 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
20f50 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
20f60 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
20f70 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
20f80 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
20f90 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
20fa0 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
20fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
20fc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
20fd0 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
20fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
20ff0 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
21000 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
21010 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
21020 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
21030 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
21040 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
21050 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
21060 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21070 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
21080 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21090 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
210a0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
210b0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
210c0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
210d0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
210e0 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
210f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
21100 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
21110 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
21120 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
21130 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
21140 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 4f  te3FunctionUsesO
21150 74 68 65 72 53 72 63 28 70 45 78 70 72 2c 20 70  therSrc(pExpr, p
21160 53 72 63 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  SrcList) ){.    
21170 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
21180 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
21190 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
211a0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
211b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
211c0 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
211d0 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
211e0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
211f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21200 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
21210 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
21220 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
21230 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
21240 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
21250 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
21260 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
21270 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
21280 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
21290 72 2c 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a  r, pExpr)==0 ){.
212a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
212b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
212c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
212d0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
212e0 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
212f0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
21300 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
21310 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
21320 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
21330 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
21340 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
21350 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
21360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
21370 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
21380 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
21390 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
213a0 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
213b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
213c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
213d0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
213e0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
213f0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
21400 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
21410 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
21420 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
21430 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
21440 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
21450 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
21460 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
21470 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
21480 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
21490 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
214a0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
214b0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
214c0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
214d0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
214e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
214f0 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65  u.zToken, sqlite
21500 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
21510 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21530 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
21540 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
21550 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
21560 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21570 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
21580 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
21590 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
215a0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
215b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
215c0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
215d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
215e0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
215f0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
21600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21620 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
21630 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
21640 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
21650 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
21660 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
21670 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21680 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
21690 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
216a0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
216b0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
216c0 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
216d0 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
216e0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
216f0 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
21700 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
21710 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
21720 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
21730 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Prune;.      }. 
21740 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21750 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
21760 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
21770 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
21780 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
21790 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
217a0 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
217b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61  ED_PARAMETER(pWa
217c0 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f  lker);.  UNUSED_
217d0 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
217e0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  t);.  return WRC
217f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
21800 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
21810 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
21820 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
21830 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
21840 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
21850 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
21860 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
21870 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
21880 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
21890 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
218a0 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
218b0 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
218c0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
218d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
218e0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
218f0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
21900 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
21910 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
21920 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
21930 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
21940 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
21950 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
21960 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
21970 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
21980 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
21990 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
219a0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
219b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
219c0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
219d0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
219e0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
219f0 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
21a00 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  t;.  w.u.pNC = p
21a10 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
21a20 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
21a30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
21a40 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
21a50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
21a60 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
21a70 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
21a80 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
21a90 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
21aa0 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
21ab0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
21ac0 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
21ad0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
21ae0 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
21af0 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
21b00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b10 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
21b20 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
21b30 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
21b40 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
21b50 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
21b60 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
21b70 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
21b80 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
21b90 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
21ba0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
21bb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
21bc0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
21bd0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
21be0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
21bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
21c00 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
21c10 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
21c20 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
21c30 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
21c40 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
21c50 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
21c60 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
21c70 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
21c80 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
21c90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
21ca0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21cb0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
21cc0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
21cd0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
21ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
21cf0 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
21d00 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
21d10 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
21d20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
21d30 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
21d40 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
21d50 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
21d60 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
21d70 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
21d80 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20  the dallocation 
21d90 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
21da0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
21db0 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
21dc0 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
21dd0 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
21de0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21df0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
21e00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
21e10 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
21e20 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
21e30 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
21e40 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
21e50 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
21e60 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
21e70 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
21e80 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
21e90 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
21ea0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
21eb0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
21ec0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
21ed0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
21ee0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
21ef0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
21f00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21f10 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
21f20 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
21f30 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
21f40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
21f50 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
21f60 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
21f70 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
21f80 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
21f90 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
21fa0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
21fb0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
21fc0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
21fd0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
21fe0 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
21ff0 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
22000 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
22010 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
22020 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
22030 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
22040 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
22050 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
22060 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
22070 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
22080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
22090 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
220a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
220b0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
220c0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
220d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
220e0 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
220f0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
22100 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
22110 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
22120 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
22130 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
22140 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
22150 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
22160 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
22170 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
22180 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
22190 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
221a0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
221b0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
221c0 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
221d0 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
221e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
221f0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
22200 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
22210 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
22220 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
22230 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
22240 30 3b 0a 7d 0a                                   0;.}.