/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 00817c672af554321fd67c44325afd7cef0e4648:


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 6d 65 6d 63 70  ];.        memcp
3170: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3180: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3190: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31a0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31b0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
31c0: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
31d0: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
31e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
31f0: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3200: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3210: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3220: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3240: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3250: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3260: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3270: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3280: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3290: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32a0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32b0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
32c0: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
32d0: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
32e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
32f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3300: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3310: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3320: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3330: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3340: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3350: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3360: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3370: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3390: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33b0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
33c0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
33d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
33e0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
33f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3400: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3410: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3420: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3430: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3440: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3450: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3460: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3470: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3480: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3490: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34a0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34b0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
34c0: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
34d0: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
34e0: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
34f0: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3500: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3510: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3520: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3530: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3540: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3550: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3560: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3570: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3580: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
3590: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35a0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35b0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
35c0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
35d0: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
35e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
35f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3600: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3610: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3620: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3630: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3640: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3650: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
3660: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
3670: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
3680: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3690: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36a0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36b0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
36c0: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
36d0: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
36e0: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
36f0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3700: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3710: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3720: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3730: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3740: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3750: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
3760: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
3770: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
3780: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
3790: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37a0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37b0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
37c0: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
37d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
37e0: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
37f0: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3800: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3810: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3820: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3830: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3840: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3850: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3860: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3870: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3880: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3890: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38a0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38b0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
38c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
38d0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
38e0: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
38f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3900: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3910: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3920: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3930: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3940: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3950: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3960: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3970: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3980: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3990: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39a0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39b0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
39c0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
39d0: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
39e0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
39f0: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
3a00: 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b   op, pToken, 1);
3a10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  .  sqlite3ExprAt
3a20: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3a30: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3a40: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 69 66  t, pRight);.  if
3a50: 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  ( p ) {.    sqli
3a60: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
3a70: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
3a80: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65  eight);.  }.  re
3a90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3aa0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3ab0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3ac0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3ad0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3ae0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3af0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3b00: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3b10: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
3b20: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
3b30: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3b40: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
3b50: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
3b60: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
3b70: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
3b80: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
3b90: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3ba0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeft;.  }else{.
3bb0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
3bc0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3bd0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
3be0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3bf0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3c00: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
3c10: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
3c20: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
3c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
3c40: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
3c50: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
3c60: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
3c70: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
3c80: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
3c90: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
3ca0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
3cb0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
3cc0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
3cd0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
3ce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3cf0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
3d00: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
3d10: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3d20: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
3d30: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
3d40: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
3d50: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
3d60: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3d70: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
3d80: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
3d90: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
3da0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
3db0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
3dc0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
3dd0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
3de0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
3df0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
3e00: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
3e10: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
3e20: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
3e30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3e40: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
3e50: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
3e60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
3e70: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
3e80: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
3e90: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
3ea0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
3eb0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
3ec0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
3ed0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
3ee0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
3ef0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
3f00: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
3f10: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f20: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
3f30: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
3f40: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
3f50: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
3f60: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
3f70: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
3f80: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
3f90: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
3fa0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
3fb0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
3fc0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
3fd0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
3fe0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
3ff0: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4000: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4010: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4020: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4030: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4040: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4050: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
4060: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
4070: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
4080: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
4090: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
40a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
40b0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
40c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
40d0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
40e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
40f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
4100: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4110: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
4120: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
4130: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4140: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
4150: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4160: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
4170: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
4180: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
4190: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
41a0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
41b0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
41c0: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
41d0: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20  if( z[1]==0 ){. 
41e0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
41f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
4200: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
4210: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4220: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
4230: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20  z[0]=='?' );.   
4240: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4250: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
4260: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c  se->nVar);.  }el
4270: 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27  se if( z[0]=='?'
4280: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
4290: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
42a0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
42b0: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
42c0: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20  eger and.    ** 
42d0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
42e0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
42f0: 0a 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20  .    i64 i;.    
4300: 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c  int bOk = 0==sql
4310: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
4320: 2c 20 26 69 2c 20 73 71 6c 69 74 65 33 53 74 72  , &i, sqlite3Str
4330: 6c 65 6e 33 30 28 26 7a 5b 31 5d 29 2c 20 53 51  len30(&z[1]), SQ
4340: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
4350: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4360: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 74   (ynVar)i;.    t
4370: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
4380: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
4390: 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==1 );.    testc
43a0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
43b0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
43c0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
43d0: 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  -1 );.    testca
43e0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
43f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4400: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4410: 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  );.    if( bOk==
4420: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
4430: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4440: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4450: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
4460: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4470: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
4480: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
4490: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
44a0: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
44b0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
44c0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
44d0: 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d  _NUMBER]);.    }
44e0: 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73  .    if( i>pPars
44f0: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
4500: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
4510: 28 69 6e 74 29 69 3b 0a 20 20 20 20 7d 0a 20 20  (int)i;.    }.  
4520: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
4530: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
4540: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
4550: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
4560: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
4570: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
4580: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
4590: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
45a0: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
45b0: 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61  e name.    ** ha
45c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
45d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
45e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
45f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20   number.    */. 
4600: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33     int i;.    u3
4610: 32 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  2 n;.    n = sql
4620: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
4630: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4640: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
4660: 70 72 20 2a 70 45 20 3d 20 70 50 61 72 73 65 2d  pr *pE = pParse-
4670: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 3b 0a 20  >apVarExpr[i];. 
4680: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
4690: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
46a0: 6d 65 6d 63 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f  memcmp(pE->u.zTo
46b0: 6b 65 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26  ken, z, n)==0 &&
46c0: 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d   pE->u.zToken[n]
46d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
46e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
46f0: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pE->iColumn;.   
4700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4710: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
4720: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  ( i>=pParse->nVa
4730: 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  rExpr ){.      p
4740: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4750: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
4760: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 69  ->nVar);.      i
4770: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
4780: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
4790: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
47a0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
47b0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
47c0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
47d0: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
47e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
47f0: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
4800: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
4810: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
4820: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
4840: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
4860: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
4870: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
4880: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
4890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
48a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
48b0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
48c0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
48d0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
48e0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
48f0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
4900: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
4910: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
4920: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
4930: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
4940: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
4950: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
4960: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4970: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4980: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
4990: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
49a0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
49b0: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
49c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
49d0: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
49e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
49f0: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
4a00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
4a10: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
4a20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
4a30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53  ) return;.  /* S
4a40: 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73  anity check: Ass
4a50: 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74  ert that the Int
4a60: 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  Value is non-neg
4a70: 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73  ative if it exis
4a80: 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ts */.  assert( 
4a90: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4aa0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
4ab0: 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e   || p->u.iValue>
4ac0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70  =0 );.  if( !Exp
4ad0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
4ae0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
4af0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4b00: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4b10: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  >pLeft);.    sql
4b20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4b30: 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  b, p->pRight);. 
4b40: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
4b50: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
4b60: 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e 66 6c  duced) && (p->fl
4b70: 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f  ags2 & EP2_Mallo
4b80: 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  cedToken)!=0 ){.
4b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4ba0: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f  ree(db, p->u.zTo
4bb0: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ken);.    }.    
4bc0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
4bd0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
4be0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ect) ){.      sq
4bf0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4c00: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  e(db, p->x.pSele
4c10: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
4c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4c30: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
4c40: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  p->x.pList);.   
4c50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78   }.  }.  if( !Ex
4c60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4c70: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
4c80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4c90: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, p);.  }.}..
4ca0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4cb0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4cc0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4cd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74  he expression st
4ce0: 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73  ructure .** pass
4cf0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
4d00: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69  argument. This i
4d10: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20  s always one of 
4d20: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a  EXPR_FULLSIZE,.*
4d30: 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  * EXPR_REDUCEDSI
4d40: 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e  ZE or EXPR_TOKEN
4d50: 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61  ONLYSIZE..*/.sta
4d60: 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75  tic int exprStru
4d70: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b  ctSize(Expr *p){
4d80: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
4d90: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
4da0: 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e  enOnly) ) return
4db0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
4dc0: 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48  IZE;.  if( ExprH
4dd0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4de0: 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75  _Reduced) ) retu
4df0: 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  rn EXPR_REDUCEDS
4e00: 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58  IZE;.  return EX
4e10: 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a  PR_FULLSIZE;.}..
4e20: 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  /*.** The dupedE
4e30: 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69  xpr*Size() routi
4e40: 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20  nes each return 
4e50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
4e60: 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  tes required.** 
4e70: 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20  to store a copy 
4e80: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4e90: 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74   or expression t
4ea0: 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65  ree.  They diffe
4eb0: 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68  r in.** how much
4ec0: 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20   of the tree is 
4ed0: 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  measured..**.** 
4ee0: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72      dupedExprStr
4ef0: 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69  uctSize()     Si
4f00: 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45  ze of only the E
4f10: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a  xpr structure .*
4f20: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e  *     dupedExprN
4f30: 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20  odeSize()       
4f40: 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73  Size of Expr + s
4f50: 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a  pace for token.*
4f60: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
4f70: 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20  ize()           
4f80: 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73  Expr + token + s
4f90: 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74  ubtree component
4fa0: 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.**.***********
4fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ff0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  .**.** The duped
5000: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
5010: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5020: 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d  s two values OR-
5030: 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a  ed together:  .*
5040: 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20  * (1) the space 
5050: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63  required for a c
5060: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
5070: 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61  structure only a
5080: 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45  nd .** (2) the E
5090: 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74  P_xxx flags that
50a0: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
50b0: 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a  he structure siz
50c0: 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20  e should be..** 
50d0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
50e0: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
50f0: 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45  of:.**.**      E
5100: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20  XPR_FULLSIZE.** 
5110: 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45       EXPR_REDUCE
5120: 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64  DSIZE   | EP_Red
5130: 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50  uced.**      EXP
5140: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
5150: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a  | EP_TokenOnly.*
5160: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
5170: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
5180: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
5190: 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72  asking the retur
51a0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  n value.** of th
51b0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
51c0: 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67  0xfff.  The flag
51d0: 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  s can be found b
51e0: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a  y masking the.**
51f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69   return value wi
5200: 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  th EP_Reduced|EP
5210: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a  _TokenOnly..**.*
5220: 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68  * Note that with
5230: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
5240: 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75  REDUCE, this rou
5250: 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66  tines works on f
5260: 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72  ull-size.** (unr
5270: 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a  educed) Expr obj
5280: 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20  ects as they or 
5290: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74  originally const
52a0: 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61  ructed by the pa
52b0: 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  rser..** During 
52c0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
52d0: 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72  sis, extra infor
52e0: 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74  mation is comput
52f0: 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74  ed and moved int
5300: 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73  o.** later parts
5310: 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a   of teh Expr obj
5320: 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74  ect and that ext
5330: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d  ra information m
5340: 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64  ight get chopped
5350: 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65  .** off if the e
5360: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64  xpression is red
5370: 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  uced.  Note also
5380: 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
5390: 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b  t work to.** mak
53a0: 65 20 61 20 45 58 50 52 44 55 50 5f 52 45 44 55  e a EXPRDUP_REDU
53b0: 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64  CE copy of a red
53c0: 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  uced expression.
53d0: 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67    It is only leg
53e0: 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20  al.** to reduce 
53f0: 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65  a pristine expre
5400: 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20  ssion tree from 
5410: 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65  the parser.  The
5420: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
5430: 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53  ** of dupedExprS
5440: 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74  tructSize() cont
5450: 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73  ain multiple ass
5460: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
5470: 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a   that attempt.**
5480: 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
5490: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a   constraint..*/.
54a0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
54b0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  ExprStructSize(E
54c0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
54d0: 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b  s){.  int nSize;
54e0: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
54f0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
5500: 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20   || flags==0 ); 
5510: 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67  /* Only one flag
5520: 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a   value allowed *
5530: 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67  /.  if( 0==(flag
5540: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
5550: 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  ) ){.    nSize =
5560: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5580: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
5590: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
55a0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
55b0: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
55c0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
55d0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
55e0: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
55f0: 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20  ert( (p->flags2 
5600: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
5610: 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ken)==0 );.    a
5620: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
5630: 32 20 26 20 45 50 32 5f 49 72 72 65 64 75 63 69  2 & EP2_Irreduci
5640: 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ble)==0 );.    i
5650: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
5660: 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e 70  ->pRight || p->p
5670: 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69  Coll || p->x.pLi
5680: 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  st ){.      nSiz
5690: 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44  e = EXPR_REDUCED
56a0: 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65  SIZE | EP_Reduce
56b0: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
56c0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
56d0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
56e0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
56f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5700: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
5710: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5720: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
5730: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
5740: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
5750: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
5760: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5770: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
5780: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
5790: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
57a0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
57b0: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
57c0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
57d0: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
57e0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
57f0: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
5800: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
5810: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
5820: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5830: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
5840: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
5850: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
5860: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
5870: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
5880: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
5890: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
58a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
58b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
58c0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
58d0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
58e0: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
58f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
5900: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5910: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
5920: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
5930: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
5940: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
5950: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
5960: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
5970: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
5980: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
5990: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
59a0: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
59b0: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
59c0: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
59d0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
59e0: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
59f0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
5a00: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
5a10: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
5a20: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
5a30: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
5a40: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
5a50: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
5a60: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
5a70: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
5a80: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
5a90: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
5aa0: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
5ab0: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
5ac0: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
5ad0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
5ae0: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
5af0: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
5b00: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
5b10: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
5b20: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5b30: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
5b40: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
5b50: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
5b60: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
5b70: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
5b80: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
5b90: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
5ba0: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
5bb0: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
5bc0: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
5bd0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
5be0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
5bf0: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
5c00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5c10: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
5c20: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
5c30: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
5c40: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
5c50: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
5c60: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
5c70: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
5c80: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
5c90: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
5ca0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
5cb0: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
5cc0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
5cd0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
5ce0: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
5cf0: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
5d00: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
5d10: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
5d20: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
5d30: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
5d40: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
5d50: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
5d60: 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74  st byte passed t
5d70: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
5d80: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
5d90: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
5da0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
5db0: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
5dc0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
5dd0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
5de0: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
5df0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20  ){.  Expr *pNew 
5e00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
5e20: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
5e30: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
5e40: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
5e50: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
5e60: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
5e70: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20   u8 *zAlloc;.   
5e80: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20   u32 staticFlag 
5e90: 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  = 0;..    assert
5ea0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
5eb0: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
5ec0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
5ed0: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
5ee0: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
5ef0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
5f00: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
5f10: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
5f20: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73  zBuffer;.      s
5f30: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
5f40: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
5f50: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
5f60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5f70: 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70  Raw(db, dupedExp
5f80: 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29  rSize(p, flags))
5f90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
5fa0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
5fb0: 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  c;..    if( pNew
5fc0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
5fd0: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
5fe0: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
5ff0: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
6000: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
6010: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
6020: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
6030: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
6040: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
6050: 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  .      ** EXPR_T
6060: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
6070: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
6080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6090: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
60a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
60b0: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
60c0: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
60d0: 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
60e0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
60f0: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
6100: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6110: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6120: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
6130: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
6140: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
6150: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
6160: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
6170: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6180: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6190: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
61a0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
61b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
61c0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
61d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
61e0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
61f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6200: 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29   if( isReduced )
6210: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6220: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6230: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
6240: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
6250: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
6260: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
6270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6280: 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70   int nSize = exp
6290: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
62a0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
62b0: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
62c0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
62d0: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
62e0: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
62f0: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
6300: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
6310: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
6320: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
6330: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
6340: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
6350: 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
6360: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
6370: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6380: 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b 0a 20  ly|EP_Static);. 
6390: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
63a0: 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20   |= nStructSize 
63b0: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
63c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20  _TokenOnly);.   
63d0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
63e0: 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20  = staticFlag;.. 
63f0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
6400: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
6410: 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  ing, if any. */.
6420: 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e        if( nToken
6430: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
6440: 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d   *zToken = pNew-
6450: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
6460: 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53  r*)&zAlloc[nNewS
6470: 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  ize];.        me
6480: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
6490: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
64a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
64b0: 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c    if( 0==((p->fl
64c0: 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29  ags|pNew->flags)
64d0: 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
64e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
64f0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
6500: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
6510: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
6520: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  er. */.        i
6530: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
6540: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
6550: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ct) ){.         
6560: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
6570: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
6580: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
6590: 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29  lect, isReduced)
65a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
65b0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
65c0: 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  >x.pList = sqlit
65d0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
65e0: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73  , p->x.pList, is
65f0: 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20  Reduced);.      
6600: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
6610: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
6620: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
6630: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
6640: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
6650: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e 65 77  AnyProperty(pNew
6660: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
6670: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
6680: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
6690: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
66a0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
66b0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
66c0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
66d0: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
66e0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
66f0: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
6700: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
6710: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
6720: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
6730: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
6740: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
6750: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
6760: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
6770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6780: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6790: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
67a0: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
67b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
67c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
67d0: 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20 30 3b  New->flags2 = 0;
67e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78  .        if( !Ex
67f0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
6800: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
6810: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
6820: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
6830: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
6840: 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  p->pLeft, 0);.  
6850: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
6860: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
6870: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
6880: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
6890: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
68a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
68b0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  New;.}../*.** Th
68c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
68d0: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
68e0: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
68f0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
6900: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
6910: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
6920: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
6930: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
6940: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
6950: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
6960: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
6970: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
6980: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
6990: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
69a0: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
69b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
69c0: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
69d0: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
69e0: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
69f0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
6a00: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
6a10: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
6a20: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
6a30: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
6a40: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
6a50: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
6a60: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
6a70: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
6a80: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
6a90: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
6aa0: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
6ab0: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
6ac0: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  uplicated..**.**
6ad0: 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   The flags param
6ae0: 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20  eter contains a 
6af0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
6b00: 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  he EXPRDUP_XXX f
6b10: 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  lags..** If the 
6b20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
6b30: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
6b40: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
6b50: 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20  eturned is a.** 
6b60: 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f  truncated versio
6b70: 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45  n of the usual E
6b80: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68  xpr structure th
6b90: 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  at will be store
6ba0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
6bb0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
6bc0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
6bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
6be0: 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ema..*/.Expr *sq
6bf0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c  lite3ExprDup(sql
6c00: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
6c10: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
6c20: 20 72 65 74 75 72 6e 20 65 78 70 72 44 75 70 28   return exprDup(
6c30: 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29  db, p, flags, 0)
6c40: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
6c50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6c60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
6c70: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
6c80: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
6c90: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
6ca0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6cb0: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
6cc0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
6cd0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
6ce0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
6cf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
6d00: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
6d10: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
6d20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6d30: 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d  pNew->iECursor =
6d40: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
6d50: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
6d60: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
6d70: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
6d80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6d90: 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70  Raw(db,  p->nExp
6da0: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
6db0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
6dc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6dd0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
6de0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
6df0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
6e00: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
6e10: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
6e20: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
6e30: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
6e40: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
6e50: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
6e60: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
6e70: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
6e80: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
6e90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
6ea0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
6eb0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
6ec0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
6ed0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
6ee0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
6ef0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
6f00: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
6f10: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
6f20: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
6f30: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
6f40: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
6f50: 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70   pItem->iCol = p
6f60: 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20  OldItem->iCol;. 
6f70: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
6f80: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
6f90: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
6fa0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6fb0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
6fc0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
6fd0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
6fe0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
6ff0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
7000: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
7010: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
7020: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
7030: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
7040: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
7050: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
7060: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
7070: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
7080: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
7090: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
70a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
70b0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
70c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
70d0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
70e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
70f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
7100: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
7110: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
7120: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
7130: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7140: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
7150: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
7160: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
7170: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
7180: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
7190: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
71a0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
71b0: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
71c0: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
71d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
71e0: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
71f0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7200: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7210: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
7220: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
7230: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
7240: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
7250: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7260: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
7270: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
7280: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7290: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
72a0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
72b0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
72c0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
72d0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
72e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
72f0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
7300: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
7310: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7320: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7330: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
7340: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
7350: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7360: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7370: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
7380: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
7390: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
73a0: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
73b0: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
73c0: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
73d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
73e0: 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64  Populated = pOld
73f0: 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
7400: 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  d;.    pNewItem-
7410: 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >zIndex = sqlite
7420: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7430: 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b  ldItem->zIndex);
7440: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e  .    pNewItem->n
7450: 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64  otIndexed = pOld
7460: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
7470: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7480: 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  pIndex = pOldIte
7490: 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  m->pIndex;.    p
74a0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
74b0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
74c0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
74d0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
74e0: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
74f0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7500: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7510: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
7520: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
7530: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
7540: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
7550: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7560: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
7570: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
7580: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
7590: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
75a0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
75b0: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
75c0: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
75d0: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
75e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
75f0: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
7600: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
7610: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
7620: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
7630: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
7640: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7650: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
7660: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7670: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
7680: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
7690: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
76a0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
76b0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
76c0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
76d0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
76e0: 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49  locRaw(db, p->nI
76f0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
7700: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
7710: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
7720: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7730: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7740: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
7750: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
7760: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
7770: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
7780: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
7790: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
77a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
77b0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
77c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
77d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
77e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
77f0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7800: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
7810: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
7820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
7830: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
7840: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7850: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7860: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7870: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
7880: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7890: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
78a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
78b0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
78c0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
78d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
78e0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
78f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7900: 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
7910: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
7920: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
7930: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
7940: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
7950: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
7960: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7970: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
7980: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7990: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
79a0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
79b0: 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66  , p->pGroupBy, f
79c0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
79d0: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
79e0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
79f0: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
7a00: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
7a10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7a20: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
7a30: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
7a40: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f   pNew->op = p->o
7a50: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  p;.  pNew->pPrio
7a60: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
7a70: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
7a80: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  or, flags);.  pN
7a90: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
7aa0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7ab0: 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73  p->pLimit, flags
7ac0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
7ad0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
7ae0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
7af0: 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  et, flags);.  pN
7b00: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
7b10: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
7b20: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  = 0;.  pNew->sel
7b30: 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
7b40: 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70  ags & ~SF_UsesEp
7b50: 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d  hemeral;.  pNew-
7b60: 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
7b70: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
7b80: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
7b90: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
7ba0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
7bb0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
7bc0: 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74  m[2] = -1;.  ret
7bd0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
7be0: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
7bf0: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
7c00: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
7c10: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
7c20: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
7c30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
7c40: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
7c50: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
7c60: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
7c70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7c80: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
7c90: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
7ca0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
7cb0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
7cc0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ist..**.** If a 
7cd0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
7ce0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7cf0: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
7d00: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
7d10: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7d20: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
7d30: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
7d40: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
7d50: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
7d60: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
7d70: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
7d80: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
7d90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
7da0: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
7db0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
7dc0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
7dd0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
7de0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
7df0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
7e00: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
7e10: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
7e20: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
7e30: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
7e40: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
7e50: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
7e60: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
7e70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7e80: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73  ->db;.  if( pLis
7e90: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
7ea0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
7eb0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
7ec0: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
7ed0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
7ee0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
7ef0: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
7f00: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
7f10: 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d  nAlloc==0 );.  }
7f20: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41  .  if( pList->nA
7f30: 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78  lloc<=pList->nEx
7f40: 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  pr ){.    struct
7f50: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
7f60: 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  a;.    int n = p
7f70: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
7f80: 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   4;.    a = sqli
7f90: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
7fa0: 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a   pList->a, n*siz
7fb0: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
7fc0: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
7fd0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
7fe0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
7ff0: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
8000: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
8010: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8020: 63 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a  cSize(db, a)/siz
8030: 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20  eof(a[0]);.  }. 
8040: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8050: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
8060: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
8070: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8080: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
8090: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
80a0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
80b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
80c0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
80d0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
80e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
80f0: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
8100: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
8110: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
8120: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
8130: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
8140: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
8150: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
8160: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
8170: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
8180: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
8190: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
81a0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
81b0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
81c0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
81d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
81e0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
81f0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
8200: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
8210: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
8220: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
8230: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
8240: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
8250: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
8260: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
8270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
8280: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
8290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
82a0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
82b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
82c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
82d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
82e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
82f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
8300: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
8310: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
8320: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
8330: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
8340: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
8350: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
8360: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
8370: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
8380: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
8390: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
83a0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
83b0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
83c0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
83d0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
83e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
83f0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
8400: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
8410: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
8420: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
8430: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
8440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
8450: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
8460: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
8470: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
8480: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
8490: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
84a0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
84b0: 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a  uote && pItem->z
84c0: 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65  Name ) sqlite3De
84d0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
84e0: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
84f0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
8500: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
8510: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
8520: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8530: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
8540: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
8550: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
8560: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
8570: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
8580: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
8590: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
85a0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
85b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
85c0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
85d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
85e0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
85f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8600: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
8610: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8620: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
8630: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8640: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8650: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
8660: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
8670: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
8680: 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  .  ExprSpan *pSp
8690: 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an         /* Th
86a0: 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64  e span to be add
86b0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
86c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
86d0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
86e0: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
86f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
8700: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
8710: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8720: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8730: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8740: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8750: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8760: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
8770: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
8780: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65  ocFailed || pIte
8790: 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d  m->pExpr==pSpan-
87a0: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71  >pExpr );.    sq
87b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
87c0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
87d0: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
87e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
87f0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
8800: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
8840: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
8850: 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rt));.  }.}../*.
8860: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
8870: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
8880: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
8890: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
88a0: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
88b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
88c0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
88d0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
88e0: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
88f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
8900: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8910: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
8920: 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e  *zObject.){.  in
8930: 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64  t mx = pParse->d
8940: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8950: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a  _LIMIT_COLUMN];.
8960: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
8970: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
8980: 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73  xpr==mx );.  tes
8990: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
89a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
89b0: 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45  mx+1 );.  if( pE
89c0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
89d0: 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20  nExpr>mx ){.    
89e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
89f0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
8a00: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22  y columns in %s"
8a10: 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a  , zObject);.  }.
8a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
8a30: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
8a40: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
8a50: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8a60: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
8a70: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
8a80: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
8a90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
8aa0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
8ab0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
8ac0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
8ad0: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
8ae0: 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  | (pList->nExpr=
8af0: 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c  =0 && pList->nAl
8b00: 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  loc==0) );.  ass
8b10: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8b20: 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  r<=pList->nAlloc
8b30: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
8b40: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
8b50: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
8b60: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
8b70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8b80: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
8b90: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
8ba0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
8bb0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
8bc0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8bd0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
8be0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
8bf0: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
8c00: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
8c10: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
8c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  }../*.** These r
8c30: 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b  outines are Walk
8c40: 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57  er callbacks.  W
8c50: 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20  alker.u.pi is a 
8c60: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
8c70: 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65   integer.  These
8c80: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68   routines are ch
8c90: 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73  ecking an expres
8ca0: 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69  sion to see.** i
8cb0: 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61  f it is a consta
8cc0: 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72  nt.  Set *Walker
8cd0: 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68  .u.pi to 0 if th
8ce0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  e expression is.
8cf0: 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e  ** not constant.
8d00: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
8d10: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61  lback routines a
8d20: 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  re used to imple
8d30: 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ment the followi
8d40: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ng:.**.**     sq
8d50: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
8d60: 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c  ant().**     sql
8d70: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8d80: 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20  ntNotJoin().**  
8d90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
8da0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
8db0: 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  on().**.*/.stati
8dc0: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
8dd0: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
8de0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
8df0: 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66  pExpr){..  /* If
8e00: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73   pWalker->u.i is
8e10: 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   3 then any term
8e20: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
8e30: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
8e40: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
8e50: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
8e60: 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61  of a join disqua
8e70: 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65  lifies the expre
8e80: 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20  ssion.  ** from 
8e90: 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
8ea0: 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20   constant. */.  
8eb0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
8ec0: 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e  ==3 && ExprHasAn
8ed0: 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
8ee0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
8ef0: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  .    pWalker->u.
8f00: 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  i = 0;.    retur
8f10: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
8f20: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
8f30: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
8f40: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
8f50: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
8f60: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
8f70: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
8f80: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
8f90: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32   pWalker->u.i==2
8fa0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
8fb0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
8fc0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
8fd0: 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==2 ) return 0;.
8fe0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
8ff0: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
9000: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73  e TK_ID:.    cas
9010: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
9020: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
9030: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
9040: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9050: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9060: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
9070: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9080: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9090: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
90a0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
90b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
90c0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
90d0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
90e0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
90f0: 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  N );.      pWalk
9100: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20  er->u.i = 0;.   
9110: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
9120: 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  ort;.    default
9130: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
9140: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9150: 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c  SELECT ); /* sel
9160: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9170: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
9180: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
9190: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
91a0: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65  _EXISTS ); /* se
91b0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
91c0: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
91d0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
91e0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
91f0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
9200: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
9210: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
9220: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  lker, Select *No
9230: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
9240: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
9250: 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ed);.  pWalker->
9260: 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  u.i = 0;.  retur
9270: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73  n WRC_Abort;.}.s
9280: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73  tatic int exprIs
9290: 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69  Const(Expr *p, i
92a0: 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20  nt initFlag){.  
92b0: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e  Walker w;.  w.u.
92c0: 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20  i = initFlag;.  
92d0: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
92e0: 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  = exprNodeIsCons
92f0: 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  tant;.  w.xSelec
9300: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
9310: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9320: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
9330: 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
9340: 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f  turn w.u.i;.}../
9350: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
9360: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
9370: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
9380: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
9390: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
93a0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
93b0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
93c0: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
93d0: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
93e0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
93f0: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
9400: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
9410: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
9420: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
9430: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
9440: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
9450: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
9460: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
9470: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
9480: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
9490: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
94a0: 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d  IsConst(p, 1);.}
94b0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
94c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
94d0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
94e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
94f0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74  constant.** that
9500: 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61   does no origina
9510: 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  te from the ON o
9520: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
9530: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65  of a join..** Re
9540: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76  turn 0 if it inv
9550: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
9560: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
9570: 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a  s or terms from.
9580: 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e  ** an ON or USIN
9590: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  G clause..*/.int
95a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
95b0: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
95c0: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
95d0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
95e0: 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  3);.}../*.** Wal
95f0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
9600: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
9610: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9620: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
9630: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
9640: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
9650: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
9660: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
9670: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
9680: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
9690: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
96a0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
96b0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
96c0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
96d0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
96e0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
96f0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
9700: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9710: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
9720: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
9730: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9740: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9750: 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  n(Expr *p){.  re
9760: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
9770: 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 2);.}../*.**
9780: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
9790: 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e  on p codes a con
97a0: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
97b0: 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
97c0: 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
97d0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
97e0: 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
97f0: 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
9800: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
9810: 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
9820: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9830: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
9840: 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
9850: 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
9860: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
9870: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
9880: 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
9890: 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
98a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
98b0: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
98c0: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
98d0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
98e0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70  ..  /* If an exp
98f0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
9900: 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68  teger literal th
9910: 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67  at fits in a sig
9920: 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20  ned 32-bit.  ** 
9930: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
9940: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
9950: 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  ag will have alr
9960: 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f  eady been set */
9970: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
9980: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
9990: 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  (p->flags & EP_I
99a0: 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20  ntValue)!=0.    
99b0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
99c0: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a  3GetInt32(p->u.z
99d0: 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29  Token, &rc)==0 )
99e0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ;..  if( p->flag
99f0: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
9a00: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
9a10: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
9a20: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9a30: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
9a40: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  ){.    case TK_U
9a50: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63  PLUS: {.      rc
9a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73   = sqlite3ExprIs
9a70: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
9a80: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
9a90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9aa0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
9ab0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
9ac0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9ad0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
9ae0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
9af0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
9b00: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
9b10: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
9b20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9b30: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
9b40: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
9b50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9b60: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
9b70: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
9b80: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
9b90: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
9ba0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
9bb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
9bc0: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
9bd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9be0: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
9bf0: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
9c00: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
9c10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
9c20: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
9c30: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
9c40: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
9c50: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
9c60: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
9c70: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
9c80: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
9c90: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
9ca0: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
9cb0: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
9cc0: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
9cd0: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
9ce0: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
9cf0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
9d00: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
9d10: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
9d20: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
9d30: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
9d40: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
9d50: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
9d60: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
9d70: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
9d80: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
9d90: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
9da0: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
9db0: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
9dc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9dd0: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
9de0: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
9df0: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
9e00: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
9e10: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
9e20: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
9e30: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
9e40: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
9e50: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
9e60: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
9e70: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
9e80: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
9e90: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
9ea0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
9eb0: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
9ec0: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
9ed0: 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75  urn 0;.    defau
9ee0: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
9ef0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
9f00: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f   Generate an OP_
9f10: 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69  IsNull instructi
9f20: 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20 72 65  on that tests re
9f30: 67 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20  gister iReg and 
9f40: 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61  jumps.** to loca
9f50: 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68  tion iDest if th
9f60: 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20  e value in iReg 
9f70: 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61  is NULL.  The va
9f80: 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20  lue in iReg .** 
9f90: 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  was computed by 
9fa0: 70 45 78 70 72 2e 20 20 49 66 20 77 65 20 63 61  pExpr.  If we ca
9fb0: 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20  n look at pExpr 
9fc0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
9fd0: 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  and.** determine
9fe0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76   that it can nev
9ff0: 65 72 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55  er generate a NU
a000: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  LL, then the OP_
a010: 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e  IsNull operation
a020: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
a030: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
a040: 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
a050: 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76  lJump(.  Vdbe *v
a060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
a070: 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
a080: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
a090: 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78   const Expr *pEx
a0a0: 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e  pr,  /* Only gen
a0b0: 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20  erate OP_IsNull 
a0c0: 69 66 20 74 68 69 73 20 65 78 70 72 20 63 61 6e  if this expr can
a0d0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
a0e0: 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 20  t iReg,         
a0f0: 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61    /* Test the va
a100: 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
a110: 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f  ster for NULL */
a120: 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20 20 20  .  int iDest    
a130: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
a140: 65 72 65 20 69 66 20 74 68 65 20 76 61 6c 75 65  ere if the value
a150: 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20   is null */.){. 
a160: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
a170: 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29  CanBeNull(pExpr)
a180: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a190: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a1a0: 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44  IsNull, iReg, iD
a1b0: 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
a1c0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
a1d0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
a1e0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73  ession is a cons
a1f0: 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64  tant which would
a200: 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   be.** unchanged
a210: 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   by OP_Affinity 
a220: 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74  with the affinit
a230: 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  y given in the s
a240: 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
a250: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
a260: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
a270: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
a280: 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
a290: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
a2a0: 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e  e omitted.  When
a2b0: 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e   in doubt return
a2c0: 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65   FALSE.  A false
a2d0: 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20   negative.** is 
a2e0: 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c  harmless.  A fal
a2f0: 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77  se positive, how
a300: 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74  ever, can result
a310: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a   in the wrong.**
a320: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
a330: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
a340: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
a350: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20  (const Expr *p, 
a360: 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20  char aff){.  u8 
a370: 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53  op;.  if( aff==S
a380: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
a390: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69   return 1;.  whi
a3a0: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
a3b0: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
a3c0: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
a3d0: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
a3e0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
a3f0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
a400: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
a410: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
a420: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
a430: 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
a440: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
a450: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
a460: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a470: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
a480: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
a490: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
a4a0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
a4b0: 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  AL || aff==SQLIT
a4c0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
a4d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a4e0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
a4f0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
a500: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
a510: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a520: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65  BLOB: {.      re
a530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
a540: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
a550: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
a560: 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29  ( p->iTable>=0 )
a570: 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62  ;  /* p cannot b
a580: 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43  e part of a CHEC
a590: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  K constraint */.
a5a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
a5b0: 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20  iColumn<0.      
a5c0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
a5d0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
a5e0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
a5f0: 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20  FF_NUMERIC);.   
a600: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
a610: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
a620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a630: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
a640: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
a650: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
a660: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
a670: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
a680: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
a690: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
a6a0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
a6b0: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
a6c0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
a6d0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
a6e0: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
a6f0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
a700: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
a710: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
a720: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
a730: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a740: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
a750: 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70  ble to the IN op
a760: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
a770: 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72  ion on a.** quer
a780: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
a790: 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28  .**       x IN (
a7a0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
a7b0: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
a7c0: 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20  CT... clause is 
a7d0: 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
a7e0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  the parameter to
a7f0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
a800: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65  ..**.** The Sele
a810: 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ct object passed
a820: 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20   in has already 
a830: 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65  been preprocesse
a840: 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f  d and no.** erro
a850: 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75  rs have been fou
a860: 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nd..*/.#ifndef S
a870: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a880: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
a890: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
a8a0: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
a8b0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
a8c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a8d0: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
a8e0: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
a8f0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
a900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
a910: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
a920: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
a930: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
a940: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
a950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
a960: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
a970: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
a980: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
a990: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
a9a0: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
a9b0: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
a9c0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
a9d0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
a9e0: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
a9f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
aa00: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
aa10: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
aa20: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
aa30: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
aa40: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
aa50: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
aa60: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
aa70: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
aa80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
aa90: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
aab0: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
aac0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
aad0: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
aae0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
aaf0: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
ab00: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
ab10: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
ab20: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
ab30: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
ab40: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
ab50: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
ab60: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab80: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
ab90: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
aba0: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
abb0: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
abc0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
abd0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
abe0: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
abf0: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
ac00: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
ac10: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
ac20: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
ac30: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
ac40: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
ac50: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
ac60: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
ac70: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62    if( NEVER(pTab
ac80: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
ac90: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
aca0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
acb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
acc0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
acd0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
ace0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
acf0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
ad00: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
ad10: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
ad20: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
ad30: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
ad40: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
ad50: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
ad60: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
ad70: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
ad80: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
ad90: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
ada0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
adb0: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
adc0: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
add0: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
ade0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
adf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
ae00: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
ae10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ae20: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
ae30: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
ae40: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
ae50: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
ae60: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
ae70: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
ae80: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
ae90: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
aea0: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
aeb0: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
aec0: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
aed0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
aee0: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
aef0: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
af00: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
af10: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75   index of the cu
af20: 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74  rsor opened on t
af30: 68 65 20 62 2d 74 72 65 65 20 28 64 61 74 61 62  he b-tree (datab
af40: 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62  ase table, datab
af50: 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72  ase index .** or
af60: 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29   ephermal table)
af70: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58   is stored in pX
af80: 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20  ->iTable before 
af90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
afa0: 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65  turns..** The re
afb0: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
afc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
afd0: 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
afe0: 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
aff0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
b000: 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68  INDEX_ROWID - Th
b010: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
b020: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
b030: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
b040: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54  _INDEX_INDEX - T
b050: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
b060: 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61  ened on a databa
b070: 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  se index..**   I
b080: 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20  N_INDEX_EPH -   
b090: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
b0a0: 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
b0b0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b0d0: 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
b0e0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
b0f0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
b100: 69 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20 6f  ing b-tree may o
b110: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74  nly be used if t
b120: 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
b130: 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f  the simple.** fo
b140: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  rm:.**.**     SE
b150: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
b160: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
b170: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
b180: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
b190: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
b1a0: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
b1b0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
b1c0: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
b1d0: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
b1e0: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
b1f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
b200: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
b210: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
b220: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
b230: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
b240: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
b250: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
b260: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
b270: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
b280: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
b290: 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63  * has a UNIQUE c
b2a0: 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49  onstraint or UNI
b2b0: 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  QUE index..**.**
b2c0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
b2d0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
b2e0: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
b2f0: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
b300: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
b310: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
b320: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
b330: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
b340: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
b350: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
b360: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
b370: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b380: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
b390: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
b3a0: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
b3b0: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
b3c0: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lumn..**.** When
b3d0: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
b3e0: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
b3f0: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
b400: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
b410: 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  tion.** needs to
b420: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
b430: 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75   not the structu
b440: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53  re contains an S
b450: 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75  QL NULL .** valu
b460: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
b470: 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65  rrectly evaluate
b480: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b   expressions lik
b490: 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e  e "X IN (Y, Z)".
b4a0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
b4b0: 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
b4c0: 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
b4d0: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
b4e0: 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
b4f0: 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
b500: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
b510: 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
b520: 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
b530: 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75  .** to *prNotFou
b540: 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nd. If there is 
b550: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
b560: 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
b570: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
b580: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
b590: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
b5a0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
b5b0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
b5c0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
b5d0: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
b5e0: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
b5f0: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
b600: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
b610: 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29  L.  If the (...)
b620: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
b630: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
b640: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
b650: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
b660: 20 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68   the SELECT with
b670: 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20  in the (...).** 
b680: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
b690: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
b6a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
b6b0: 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74  allocated regist
b6c0: 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74  er is.** reset t
b6d0: 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65  o NULL each time
b6e0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
b6f0: 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c   rerun. This all
b700: 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65  ows the.** calle
b710: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
b720: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  de equivalent to
b730: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
b740: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69  **.**   if( regi
b750: 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a  ster==NULL ){.**
b760: 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20       has_null = 
b770: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
b780: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
b790: 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65   null>.**     re
b7a0: 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20  gister = 1.**   
b7b0: 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  }.**.** in order
b7c0: 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e   to avoid runnin
b7d0: 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64  g the <test if d
b7e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
b7f0: 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20  ntains null>.** 
b800: 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20  test more often 
b810: 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72  than is necessar
b820: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
b830: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b840: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
b850: 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20  ndInIndex(Parse 
b860: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
b870: 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75  X, int *prNotFou
b880: 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  nd){.  Select *p
b890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8b0: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
b8c0: 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
b8d0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
b8e0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b900: 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
b910: 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
b920: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
b930: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
b940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
b950: 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
b960: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
b970: 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72  stBeUnique = (pr
b980: 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20  NotFound==0);   
b990: 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
b9a0: 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
b9b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
b9c0: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20  op==TK_IN );..  
b9d0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
b9e0: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  if an existing t
b9f0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61  able or index ca
ba00: 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  n be used to.  *
ba10: 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75  * satisfy the qu
ba20: 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72  ery.  This is pr
ba30: 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65  eferable to gene
ba40: 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20  rating a new .  
ba50: 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  ** ephemeral tab
ba60: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28  le..  */.  p = (
ba70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ba80: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
ba90: 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  ) ? pX->x.pSelec
baa0: 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  t : 0);.  if( AL
bab0: 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72  WAYS(pParse->nEr
bac0: 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69  r==0) && isCandi
bad0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
bae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
baf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb10: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
bb20: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
bb30: 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c   *pExpr = p->pEL
bb40: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
bb50: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
bb60: 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20   <column> */.   
bb70: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
bb80: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  r->iColumn;     
bb90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bba0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75   of column <colu
bbb0: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62 65 20  mn> */.    Vdbe 
bbc0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
bbd0: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
bbe0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
bbf0: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
bc00: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
bc10: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
bc20: 5b 30 5d 2e 70 54 61 62 3b 20 20 20 20 20 20 2f  [0].pTab;      /
bc30: 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
bc40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc70: 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
bc80: 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 0a 20  or pTab */.   . 
bc90: 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50     /* Code an OP
bca0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e  _VerifyCookie an
bcb0: 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
bcc0: 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
bcd0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
bce0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
bcf0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
bd00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
bd10: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
bd20: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
bd30: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
bd40: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
bd50: 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
bd60: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
bd70: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
bd80: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
bd90: 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e  from two places.
bda0: 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74   In both cases t
bdb0: 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68  he vdbe.    ** h
bdc0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
bdd0: 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73  allocated. So as
bde0: 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56  sume sqlite3GetV
bdf0: 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a  dbe() is always.
be00: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
be10: 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  l here..    */. 
be20: 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20     assert(v);.  
be30: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
be40: 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d        int iMem =
be50: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
be60: 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
be70: 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d  ;..      iAddr =
be80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be90: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65  p1(v, OP_If, iMe
bea0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
beb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bec0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d  P_Integer, 1, iM
bed0: 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  em);..      sqli
bee0: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
bef0: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
bf00: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
bf10: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
bf20: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
bf30: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
bf40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bf50: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
bf60: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
bf70: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf90: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
bfa0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
bfb0: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
bfc0: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
bfd0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
bfe0: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
bff0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65  .      ** be use
c000: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
c010: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d  temp-table, it m
c020: 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61  ust be ordered a
c030: 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a  ccording.      *
c040: 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74  * to this collat
c050: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a  ion sequence.  *
c060: 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
c070: 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
c080: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
c090: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
c0a0: 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a  pLeft, pExpr);..
c0b0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
c0c0: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
c0d0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
c0e0: 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  ed to perform th
c0f0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  e .      ** comp
c100: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
c110: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
c120: 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ty of the column
c130: 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
c140: 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   is not, it is n
c150: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
c160: 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20  se any index..  
c170: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
c180: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
c190: 6f 6e 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a  onAffinity(pX);.
c1a0: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
c1b0: 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61  ty_ok = (pTab->a
c1c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
c1d0: 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51  ty==aff||aff==SQ
c1e0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
c1f0: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
c200: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c210: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
c220: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
c230: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c240: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
c250: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
c260: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
c270: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
c280: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
c290: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
c2a0: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
c2b0: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
c2c0: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
c2d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
c2e0: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
c2f0: 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20  OE_None)).      
c300: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
c310: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
c320: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
c330: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
c340: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
c350: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
c360: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
c370: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
c380: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
c390: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41  x);.          iA
c3a0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c3b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
c3c0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
c3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c3e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c3f0: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, 1, iMem);.  
c400: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c410: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
c420: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
c430: 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
c440: 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e     pKey,P4_KEYIN
c470: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
c480: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
c490: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
c4a0: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
c4b0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
c4c0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20  _INDEX_INDEX;.. 
c4d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c4e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c4f0: 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
c500: 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64    if( prNotFound
c510: 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b   && !pTab->aCol[
c520: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  iCol].notNull ){
c530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72  .            *pr
c540: 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61  NotFound = ++pPa
c550: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
c560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
c570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c580: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
c590: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
c5a0: 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20  ld not found an 
c5b0: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
c5c0: 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
c5d0: 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
c5e0: 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
c5f0: 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
c600: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
c610: 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
c620: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ob..    */.    d
c630: 6f 75 62 6c 65 20 73 61 76 65 64 4e 51 75 65 72  ouble savedNQuer
c640: 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
c650: 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
c660: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
c670: 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
c680: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
c690: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
c6a0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e  nd ){.      *prN
c6b0: 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61  otFound = rMayHa
c6c0: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
c6d0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c  e->nMem;.    }el
c6e0: 73 65 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  se{.      testca
c6f0: 73 65 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  se( pParse->nQue
c700: 72 79 4c 6f 6f 70 3e 28 64 6f 75 62 6c 65 29 31  ryLoop>(double)1
c710: 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   );.      pParse
c720: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 28  ->nQueryLoop = (
c730: 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20 20 20  double)1;.      
c740: 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
c750: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
c760: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
c770: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
c780: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
c790: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
c7a0: 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
c7b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
c7c0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
c7d0: 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
c7e0: 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
c7f0: 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
c800: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
c810: 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
c820: 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
c830: 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
c840: 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65  = iTab;.  }.  re
c850: 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
c860: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
c870: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
c880: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
c890: 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
c8a0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
c8b0: 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
c8c0: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
c8d0: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
c8e0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
c8f0: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
c900: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
c910: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
c920: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
c930: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
c940: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
c960: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
c970: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
c980: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
c990: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
c9a0: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
c9b0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
c9c0: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
c9d0: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
c9e0: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
c9f0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
ca00: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
ca10: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
ca20: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
ca30: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
ca40: 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
ca50: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
ca60: 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
ca70: 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
ca80: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
ca90: 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
caa0: 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
cab0: 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
cac0: 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
cad0: 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
cae0: 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
caf0: 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
cb00: 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
cb10: 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
cb20: 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
cb30: 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
cb40: 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
cb50: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
cb60: 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
cb70: 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
cb80: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
cb90: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
cba0: 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
cbb0: 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
cbc0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
cbd0: 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
cbe0: 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
cbf0: 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
cc00: 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
cc10: 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  ..** Furthermore
cc20: 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e 20 61  , the IN is in a
cc30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
cc40: 64 20 74 68 61 74 20 77 65 20 72 65 61 6c 6c 79  d that we really
cc50: 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72   want.** to iter
cc60: 61 74 65 20 6f 76 65 72 20 74 68 65 20 52 48 53  ate over the RHS
cc70: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
cc80: 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tor in order to 
cc90: 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a  quickly locate.*
cca0: 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64  * all correspond
ccb0: 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73  ing LHS elements
ccc0: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
ccd0: 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
cce0: 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65  ialize.** the re
ccf0: 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
cd00: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20  rMayHaveNull to 
cd10: 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
cd20: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
cd30: 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63 68 61  e.** care of cha
cd40: 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
cd50: 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  ter value to non
cd60: 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
cd70: 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
cd80: 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
cd90: 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68  Null is zero, th
cda0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
cdb0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 62 65  e subquery is be
cdc0: 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20  ing used.** for 
cdd0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 69  membership testi
cde0: 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20  ng only.  There 
cdf0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
ce00: 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20  itialize any.** 
ce10: 72 65 67 69 73 74 65 72 73 20 74 6f 20 69 6e 64  registers to ind
ce20: 69 63 61 74 65 20 74 68 65 20 70 72 65 73 65 6e  icate the presen
ce30: 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20 6f 66  se or absence of
ce40: 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48   NULLs on the RH
ce50: 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53  S..**.** For a S
ce60: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
ce70: 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e  operator, return
ce80: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68   the register th
ce90: 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  at holds the.** 
cea0: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20  result.  For IN 
ceb0: 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
cec0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
ced0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
cee0: 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64  e is 0..*/.#ifnd
cef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
cf00: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
cf10: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
cf20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cf30: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
cf40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cf50: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cf70: 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f  he IN, SELECT, o
cf80: 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
cf90: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48  r */.  int rMayH
cfa0: 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f  aveNull,       /
cfb0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
cfc0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
cfd0: 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52  NULLs exist in R
cfe0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  HS */.  int isRo
cff0: 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
d000: 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20  /* If true, LHS 
d010: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  of IN operator i
d020: 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  s a rowid */.){.
d030: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
d040: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
d060: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
d070: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
d080: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
d0b0: 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
d0c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
d0d0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
d0e0: 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
d0f0: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
d100: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
d110: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
d120: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
d130: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
d140: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
d150: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
d160: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
d170: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
d180: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
d190: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
d1a0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
d1b0: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
d1c0: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
d1d0: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
d1e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
d1f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
d200: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
d210: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
d220: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
d230: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
d240: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
d250: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
d260: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
d270: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
d280: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
d290: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
d2a0: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
d2b0: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
d2c0: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
d2d0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
d2e0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
d2f0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
d300: 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61  rSelect) && !pPa
d310: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
d320: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20   ){.    int mem 
d330: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d350: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
d360: 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73 74  , mem);.    test
d370: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
d380: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d390: 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b  nteger, 1, mem);
d3a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73  .    assert( tes
d3b0: 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73  tAddr>0 || pPars
d3c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d3d0: 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  led );.  }..#ifn
d3e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d3f0: 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50  EXPLAIN.  if( pP
d400: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
d410: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
d420: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
d430: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61  ntf(.        pPa
d440: 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54  rse->db, "EXECUT
d450: 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20  E %s%s SUBQUERY 
d460: 25 64 22 2c 20 74 65 73 74 41 64 64 72 3f 22 22  %d", testAddr?""
d470: 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
d480: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
d490: 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
d4a0: 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65  "SCALAR", pParse
d4b0: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a  ->iNextSelectId.
d4c0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
d4d0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
d4e0: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
d4f0: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
d500: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
d510: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  NAMIC);.  }.#end
d520: 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  if..  switch( pE
d530: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
d540: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
d550: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
d560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
d570: 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
d580: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
d590: 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  */.      KeyInfo
d5a0: 20 6b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20   keyInfo;       
d5b0: 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
d5c0: 66 6f 72 20 74 68 65 20 67 65 6e 65 72 61 74 65  for the generate
d5d0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  d table */.     
d5e0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d600: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
d610: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
d620: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
d630: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
d640: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20  Expr->pLeft; /* 
d650: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
d660: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
d670: 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76       if( rMayHav
d680: 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  eNull ){.       
d690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d6a0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
d6b0: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
d6c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d6d0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
d6e0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
d6f0: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
d700: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
d710: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
d720: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
d730: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
d740: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
d750: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
d760: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
d770: 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
d780: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
d790: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
d7a0: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
d7b0: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
d7c0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
d7d0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
d7e0: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
d7f0: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
d800: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
d810: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
d820: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
d830: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
d840: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
d850: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
d860: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
d870: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
d880: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
d890: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
d8a0: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
d8b0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
d8c0: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
d8d0: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
d8e0: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
d8f0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
d900: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
d910: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
d920: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
d930: 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
d940: 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
d950: 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
d960: 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
d970: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
d980: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
d990: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
d9a0: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
d9b0: 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
d9c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
d9d0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
d9e0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d9f0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
da00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
da10: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
da20: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
da30: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
da40: 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 3d 3d  ( rMayHaveNull==
da50: 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  0 ) sqlite3VdbeC
da60: 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
da70: 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
da80: 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e     memset(&keyIn
da90: 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  fo, 0, sizeof(ke
daa0: 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b  yInfo));.      k
dab0: 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20  eyInfo.nField = 
dac0: 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  1;..      if( Ex
dad0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
dae0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
daf0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
db00: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
db10: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
db20: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
db30: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
db40: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
db50: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
db60: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
db70: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
db80: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
db90: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
dba0: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
dbb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
dbc0: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
dbd0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
dbe0: 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
dbf0: 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
dc00: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
dc10: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
dc20: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
dc30: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
dc40: 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
dc50: 66 66 69 6e 69 74 79 20 3d 20 28 75 38 29 61 66  ffinity = (u8)af
dc60: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
dc70: 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
dc80: 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
dc90: 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
dca0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  e );.        pEx
dcb0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 69  pr->x.pSelect->i
dcc0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
dcd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
dce0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
dcf0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  pr->x.pSelect, &
dd00: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
dd10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
dd20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
dd30: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
dd40: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
dd50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c  ;.        if( AL
dd60: 57 41 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26  WAYS(pEList!=0 &
dd70: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
dd80: 30 29 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  0) ){ .         
dd90: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
dda0: 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
ddb0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
ddc0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ddd0: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
dde0: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
ddf0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
de00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
de10: 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
de20: 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
de30: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
de40: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
de50: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
de60: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
de70: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
de80: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
de90: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
dea0: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
deb0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
dec0: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
ded0: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
dee0: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
def0: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
df00: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
df10: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
df20: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
df30: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
df40: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
df50: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
df60: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
df70: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
df80: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
df90: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
dfa0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
dfb0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
dfc0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
dfd0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
dfe0: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
dff0: 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r3;..        if(
e000: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
e010: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
e020: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
e030: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
e040: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
e050: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
e060: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
e070: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e080: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c  );..        /* L
e090: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
e0a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
e0b0: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
e0c0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
e0d0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
e0e0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
e0f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
e100: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
e110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e120: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e130: 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20  ll, 0, r2);.    
e140: 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
e150: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
e160: 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
e170: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
e180: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
e190: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
e1a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56            int iV
e1b0: 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20  alToIns;..      
e1c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
e1d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
e1e0: 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
e1f0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
e200: 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62          ** disab
e210: 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
e220: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
e230: 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
e240: 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a  sure.          *
e250: 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79  * this code only
e260: 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20   executes once. 
e270: 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e   Because for a n
e280: 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  on-constant.    
e290: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
e2a0: 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
e2b0: 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
e2c0: 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
e2d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
e2e0: 20 69 66 28 20 74 65 73 74 41 64 64 72 20 26 26   if( testAddr &&
e2f0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
e300: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
e310: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e320: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
e330: 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d  oop(v, testAddr-
e340: 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 2);.         
e350: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b     testAddr = 0;
e360: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
e370: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
e380: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
e390: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
e3a0: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
e3b0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
e3c0: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
e3d0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
e3e0: 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
e3f0: 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
e400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e410: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
e420: 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
e430: 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
e440: 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
e450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e460: 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
e470: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
e480: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
e490: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
e4a0: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
e4b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e4c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e4d0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
e4e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
e510: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
e540: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
e550: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
e560: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
e570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e590: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
e5a0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
e5b0: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
e5c0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
e5d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
e5e0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
e5f0: 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
e600: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e620: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
e630: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
e640: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
e650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
e660: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e670: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
e680: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
e690: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
e6a0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
e6b0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
e6c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e6d0: 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20  f( !isRowid ){. 
e6e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e6f0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
e700: 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79  dr, (void *)&key
e710: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
e720: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
e740: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
e750: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
e760: 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
e770: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
e780: 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
e790: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
e7a0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
e7b0: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
e7c0: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
e7d0: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
e7e0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
e7f0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
e800: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
e810: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
e820: 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
e830: 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
e840: 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
e850: 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
e860: 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
e870: 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
e880: 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
e890: 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
e8a0: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
e8b0: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
e8c0: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
e8d0: 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
e900: 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
e910: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
e920: 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e940: 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
e950: 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
e960: 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
e970: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e980: 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
e990: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e9a0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
e9b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e9c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
e9d0: 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
e9e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
e9f0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
ea00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ea10: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
ea20: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
ea30: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
ea40: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
ea50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
ea60: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
ea70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
ea80: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
ea90: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
eaa0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
eab0: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
eac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ead0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
eae0: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  ll, 0, dest.iPar
eaf0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
eb00: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
eb10: 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
eb20: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
eb30: 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
eb40: 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
eb50: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
eb60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eb70: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
eb80: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
eb90: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
eba0: 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
ebb0: 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
ebc0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ebd0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
ebe0: 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
ebf0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
ec00: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
ec10: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
ec20: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
ec30: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e        &sqlite3In
ec60: 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20  tTokens[1]);.   
ec70: 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20     pSel->iLimit 
ec80: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
ec90: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
eca0: 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
ecb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
ecc0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
ecd0: 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
ece0: 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  .iParm;.      Ex
ecf0: 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
ed00: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  (pExpr);.      b
ed10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ed20: 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20  .  if( testAddr 
ed30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ed40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
ed50: 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 20  stAddr-1);.  }. 
ed60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
ed70: 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
ed80: 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
ed90: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eda0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
edb0: 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
edc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
edd0: 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
ede0: 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
edf0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
ee00: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
ee10: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
ee20: 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
ee30: 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
ee40: 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
ee50: 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
ee60: 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
ee70: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  .  The right-han
ee80: 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20  d side (RHS).** 
ee90: 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
eea0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75  ero or more valu
eeb0: 65 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  es.  The express
eec0: 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
eed0: 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e  he LHS is.** con
eee0: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
eef0: 65 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75  e RHS.  The valu
ef00: 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  e of the express
ef10: 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28  ion is unknown (
ef20: 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20  NULL).** if the 
ef30: 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  LHS is NULL or i
ef40: 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
ef50: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
ef60: 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  n the RHS and th
ef70: 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e  e.** RHS contain
ef80: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
ef90: 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
efa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
efb0: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c  nerates code wil
efc0: 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  l jump to destIf
efd0: 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
efe0: 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
eff0: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
f000: 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
f010: 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
f020: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
f030: 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
f040: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
f050: 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
f060: 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
f070: 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
f080: 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
f090: 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
f0a0: 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69  hrough..*/.stati
f0b0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
f0c0: 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
f0d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f0e0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
f0f0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
f100: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
f110: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
f120: 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
f130: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
f140: 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
f150: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
f160: 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
f170: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
f180: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
f190: 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
f1a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
f1b0: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
f1c0: 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
f1d0: 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
f1e0: 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
f1f0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
f200: 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
f210: 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
f220: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72  values */.  char
f230: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
f240: 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
f250: 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
f260: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
f270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
f280: 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
f290: 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20  .  int r1;      
f2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
f2b0: 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
f2c0: 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  er */.  Vdbe *v;
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f2e0: 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
f2f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
f300: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
f310: 68 65 20 52 48 53 2e 20 20 20 41 66 74 65 72 20  he RHS.   After 
f320: 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 20 74  this step, the t
f330: 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
f340: 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61  .  ** pExpr->iTa
f350: 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ble will contain
f360: 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
f370: 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48  t make up the RH
f380: 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  S..  */.  v = pP
f390: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
f3a0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
f3b0: 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
f3c0: 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
f3d0: 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
f3e0: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
f3f0: 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
f400: 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
f410: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
f420: 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
f430: 72 2c 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29  r, &rRhsHasNull)
f440: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
f450: 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
f460: 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
f470: 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
f480: 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20  results.  ** of 
f490: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
f4a0: 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72  affinityStr stor
f4b0: 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  es a static stri
f4c0: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a  ng suitable for.
f4d0: 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61    ** P4 of OP_Ma
f4e0: 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  keRecord..  */. 
f4f0: 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
f500: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
f510: 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64  Expr);..  /* Cod
f520: 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
f530: 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
f540: 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20  r> IN (...)"..  
f550: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
f560: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
f570: 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  );.  r1 = sqlite
f580: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
f590: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  se);.  sqlite3Ex
f5a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f5b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29  Expr->pLeft, r1)
f5c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c  ;..  /* If the L
f5d0: 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  HS is NULL, then
f5e0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65   the result is e
f5f0: 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e  ither false or N
f600: 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20  ULL depending.  
f610: 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ** on whether th
f620: 65 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f  e RHS is empty o
f630: 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
f640: 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
f650: 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
f660: 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f  IfFalse ){.    /
f670: 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74  * Shortcut for t
f680: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
f690: 68 65 72 65 20 74 68 65 20 66 61 6c 73 65 20 61  here the false a
f6a0: 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73  nd NULL outcomes
f6b0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
f6c0: 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  same. */.    sql
f6d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f6e0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
f6f0: 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
f700: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61  }else{.    int a
f710: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
f720: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
f730: 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20  otNull, r1);.   
f740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f750: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
f760: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f770: 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
f780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f790: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f7a0: 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
f7b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f7c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
f7d0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54  );.  }..  if( eT
f7e0: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
f7f0: 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  WID ){.    /* In
f800: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
f810: 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44  RHS is the ROWID
f820: 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65   of table b-tree
f830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
f840: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f850: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
f860: 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  1, destIfFalse);
f870: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f880: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
f890: 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69  Exists, pExpr->i
f8a0: 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
f8b0: 73 65 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65  se, r1);.  }else
f8c0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
f8d0: 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
f8e0: 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  s an index b-tre
f8f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
f900: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
f910: 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
f920: 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e  r1, 1, 0, &affin
f930: 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a  ity, 1);..    /*
f940: 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62   If the set memb
f950: 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c  ership test fail
f960: 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
f970: 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  lt of the .    *
f980: 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65  * "x IN (...)" e
f990: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
f9a0: 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55  e either 0 or NU
f9b0: 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20  LL. If the set. 
f9c0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e     ** contains n
f9d0: 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  o NULL values, t
f9e0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
f9f0: 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20  s 0. If the set 
fa00: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  .    ** contains
fa10: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
fa20: 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74  L values, then t
fa30: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
fa40: 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69  .    ** expressi
fa50: 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  on is also NULL.
fa60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fa70: 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c  rRhsHasNull==0 |
fa80: 7c 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  | destIfFalse==d
fa90: 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  estIfNull ){.   
faa0: 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
fab0: 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20  h runs if it is 
fac0: 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65  known at compile
fad0: 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52   time that the R
fae0: 48 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e  HS.      ** cann
faf0: 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20  ot contain NULL 
fb00: 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70  values. This hap
fb10: 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75  pens as the resu
fb20: 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  lt.      ** of a
fb30: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
fb40: 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61  traint in the da
fb50: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
fb60: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
fb70: 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62   Also run this b
fb80: 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73  ranch if NULL is
fb90: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46   equivalent to F
fba0: 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f  ALSE.      ** fo
fbb0: 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61  r this particula
fbc0: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  r IN operator.. 
fbd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
fbe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
fbf0: 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
fc00: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
fc10: 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
fc20: 31 2c 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73  1, 1);..    }els
fc30: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
fc40: 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20  his branch, the 
fc50: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69  RHS of the IN mi
fc60: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
fc70: 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  LL and.      ** 
fc80: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
fc90: 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48  a NULL on the RH
fca0: 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72  S makes a differ
fcb0: 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20  ence in the.    
fcc0: 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20    ** outcome..  
fcd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
fce0: 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20   j1, j2, j3;..  
fcf0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65      /* First che
fd00: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
fd10: 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65   LHS is containe
fd20: 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  d in the RHS.  I
fd30: 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74  f so,.      ** t
fd40: 68 65 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65  hen the presence
fd50: 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65   of NULLs in the
fd60: 20 52 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61   RHS does not ma
fd70: 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20  tter, so jump.  
fd80: 20 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20      ** over all 
fd90: 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  of the code that
fda0: 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20   follows..      
fdb0: 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  */.      j1 = sq
fdc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
fdd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
fde0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
fdf0: 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20  , r1, 1);..     
fe00: 20 2f 2a 20 48 65 72 65 20 77 65 20 62 65 67 69   /* Here we begi
fe10: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
fe20: 65 20 74 68 61 74 20 72 75 6e 73 20 69 66 20 74  e that runs if t
fe30: 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20  he LHS is not.  
fe40: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
fe50: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
fe60: 20 20 47 65 6e 65 72 61 74 65 20 61 64 64 69 74    Generate addit
fe70: 69 6f 6e 61 6c 20 63 6f 64 65 20 74 68 61 74 0a  ional code that.
fe80: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 73 20 74        ** tests t
fe90: 68 65 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73  he RHS for NULLs
fea0: 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 63 6f  .  If the RHS co
feb0: 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68  ntains a NULL th
fec0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70  en.      ** jump
fed0: 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
fee0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
fef0: 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48   NULLs in the RH
ff00: 53 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  S then.      ** 
ff10: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61  jump to destIfFa
ff20: 6c 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lse..      */.  
ff30: 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
ff40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ff50: 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
ff60: 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33  sNull);.      j3
ff70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ff80: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
ff90: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
ffa0: 6c 65 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75  le, 0, rRhsHasNu
ffb0: 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ll, 1);.      sq
ffc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ffd0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
ffe0: 31 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b  1, rRhsHasNull);
fff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10000 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33  beJumpHere(v, j3
10010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10020 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10030 5f 41 64 64 49 6d 6d 2c 20 72 52 68 73 48 61 73  _AddImm, rRhsHas
10040 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  Null, 1);.      
10050 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10060 65 72 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20  ere(v, j2);..   
10070 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68     /* Jump to th
10080 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  e appropriate ta
10090 72 67 65 74 20 64 65 70 65 6e 64 69 6e 67 20 6f  rget depending o
100a0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
100b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48  .      ** the RH
100c0 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  S contains a NUL
100d0 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  L.      */.     
100e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
100f0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68  p2(v, OP_If, rRh
10100 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
10110 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
10120 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10130 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
10140 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20  stIfFalse);..   
10150 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75     /* The OP_Fou
10160 6e 64 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  nd at the top of
10170 20 74 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d   this branch jum
10180 70 73 20 68 65 72 65 20 77 68 65 6e 20 74 72 75  ps here when tru
10190 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75  e, .      ** cau
101a0 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c  sing the overall
101b0 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65   IN expression e
101c0 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c  valuation to fal
101d0 6c 20 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20  l through..     
101e0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
101f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10200 20 6a 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j1);.    }.  }.
10210 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
10220 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
10230 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  r1);.  sqlite3Ex
10240 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
10250 65 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d  e, 1);.  VdbeCom
10260 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
10270 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64   expr"));.}.#end
10280 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10290 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
102a0 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61  *.** Duplicate a
102b0 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a  n 8-byte value.*
102c0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
102d0 75 70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76  up8bytes(Vdbe *v
102e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e  , const char *in
102f0 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d  ){.  char *out =
10300 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10310 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44  Raw(sqlite3VdbeD
10320 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(v), 8);.  if( 
10330 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  out ){.    memcp
10340 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20  y(out, in, 8);. 
10350 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b   }.  return out;
10360 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10370 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
10380 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e  _POINT./*.** Gen
10390 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
103a0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
103b0 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
103c0 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
103d0 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
103e0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
103f0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
10400 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
10410 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
10420 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
10430 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
10440 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
10450 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
10460 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
10470 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
10480 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
10490 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
104a0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
104b0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
104c0 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
104d0 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65   char *z, int ne
104e0 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d  gateFlag, int iM
104f0 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  em){.  if( ALWAY
10500 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64  S(z!=0) ){.    d
10510 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
10520 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73   char *zV;.    s
10530 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
10540 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72  alue, sqlite3Str
10550 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45  len30(z), SQLITE
10560 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65  _UTF8);.    asse
10570 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
10580 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54  N(value) ); /* T
10590 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65  he new AtoF neve
105a0 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f  r returns NaN */
105b0 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46  .    if( negateF
105c0 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
105d0 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64  alue;.    zV = d
105e0 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
105f0 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
10600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10610 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  4(v, OP_Real, 0,
10620 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
10630 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
10640 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
10650 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
10660 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
10670 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
10680 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
10690 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
106a0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
106b0 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
106c0 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
106d0 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
106e0 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
106f0 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
10700 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
10710 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
10720 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
10730 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
10740 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10750 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
10760 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
10770 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
10780 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
10790 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
107a0 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
107b0 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
107c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
107d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
107e0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
107f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
10800 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
10810 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
10820 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
10830 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
10840 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
10850 20 63 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   c = sqlite3Atoi
10860 36 34 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71  64(z, &value, sq
10870 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
10880 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
10890 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20      if( c==0 || 
108a0 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67  (c==2 && negFlag
108b0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
108c0 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  *zV;.      if( n
108d0 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20  egFlag ){ value 
108e0 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53  = c==2 ? SMALLES
108f0 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65  T_INT64 : -value
10900 3b 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64  ; }.      zV = d
10910 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
10920 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
10930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10940 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  Op4(v, OP_Int64,
10950 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
10960 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
10970 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
10980 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
10990 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
109a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
109b0 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
109c0 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
109d0 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
109e0 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
109f0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
10a00 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
10a10 65 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  em);.#endif.    
10a20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
10a30 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74  lear a cache ent
10a40 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
10a50 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
10a60 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
10a70 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63  , struct yColCac
10a80 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  he *p){.  if( p-
10a90 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  >tempReg ){.    
10aa0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
10ab0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
10ac0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
10ad0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
10ae0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
10af0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
10b00 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
10b10 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
10b20 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a   0;.  }.}.../*.*
10b30 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
10b40 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61  column cache tha
10b50 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63  t a particular c
10b60 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20  olumn from a.** 
10b70 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
10b80 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
10b90 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
10ba0 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
10bb0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
10bc0 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
10bd0 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
10be0 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b  iCol, int iReg){
10bf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10c00 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64  minLru;.  int id
10c10 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79  xLru;.  struct y
10c20 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
10c30 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 29  assert( iReg>0 )
10c40 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e  ;  /* Register n
10c50 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79  umbers are alway
10c60 73 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  s positive */.  
10c70 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
10c80 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
10c90 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
10ca0 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
10cb0 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
10cc0 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67  ColumnCache flag
10cd0 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
10ce0 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69  lumn cache.  Thi
10cf0 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  s is used.  ** f
10d00 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20  or testing only 
10d10 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  - to verify that
10d20 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67   SQLite always g
10d30 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73  ets the same ans
10d40 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  wer.  ** with an
10d50 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f  d without the co
10d60 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f  lumn cache..  */
10d70 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
10d80 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
10d90 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 29 20  E_ColumnCache ) 
10da0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69  return;..  /* Fi
10db0 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
10dc0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a  existing entry..
10dd0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
10de0 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20  ly, the way the 
10df0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20  column cache is 
10e00 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20  currently used, 
10e10 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  we are guarantee
10e20 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  d.  ** that the 
10e30 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65  object will neve
10e40 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20  r already be in 
10e50 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74  cache.  Verify t
10e60 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20  his guarantee.. 
10e70 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
10e80 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  UG.  for(i=0, p=
10e90 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10ea0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
10eb0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
10ec0 29 7b 0a 23 69 66 20 30 20 2f 2a 20 54 68 69 73  ){.#if 0 /* This
10ed0 20 63 6f 64 65 20 77 6f 6c 64 20 72 65 6d 6f 76   code wold remov
10ee0 65 20 74 68 65 20 65 6e 74 72 79 20 66 72 6f 6d  e the entry from
10ef0 20 74 68 65 20 63 61 63 68 65 20 69 66 20 69 74   the cache if it
10f00 20 65 78 69 73 74 65 64 20 2a 2f 0a 20 20 20 20   existed */.    
10f10 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
10f20 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26  ->iTable==iTab &
10f30 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
10f40 6f 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  ol ){.      cach
10f50 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
10f60 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
10f70 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
10f80 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
10f90 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
10fa0 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  Reg;.      p->lr
10fb0 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
10fc0 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  heCnt++;.      r
10fd0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 65 6e  eturn;.    }.#en
10fe0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
10ff0 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d  p->iReg==0 || p-
11000 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c  >iTable!=iTab ||
11010 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f   p->iColumn!=iCo
11020 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
11030 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d  .  /* Find an em
11040 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70  pty slot and rep
11050 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72  lace it */.  for
11060 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11070 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
11080 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
11090 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
110a0 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b  f( p->iReg==0 ){
110b0 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  .      p->iLevel
110c0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
110d0 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d  eLevel;.      p-
110e0 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
110f0 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e        p->iColumn
11100 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
11110 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
11120 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
11130 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  = 0;.      p->lr
11140 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
11150 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  heCnt++;.      r
11160 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
11170 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
11180 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79  he last recently
11190 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72   used */.  minLr
111a0 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a  u = 0x7fffffff;.
111b0 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20    idxLru = -1;. 
111c0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
111d0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
111e0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
111f0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11200 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69     if( p->lru<mi
11210 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64  nLru ){.      id
11220 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
11230 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b  minLru = p->lru;
11240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11250 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d   ALWAYS(idxLru>=
11260 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  0) ){.    p = &p
11270 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11280 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d  [idxLru];.    p-
11290 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
112a0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
112b0 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
112c0 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c  Tab;.    p->iCol
112d0 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
112e0 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
112f0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
11300 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d   0;.    p->lru =
11310 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
11320 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
11330 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
11340 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67  ndicate that reg
11350 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69  isters between i
11360 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31  Reg..iReg+nReg-1
11370 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77   are being overw
11380 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65  ritten..** Purge
11390 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
113a0 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65  gisters from the
113b0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
113c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
113d0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61  prCacheRemove(Pa
113e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
113f0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
11400 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
11410 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20   iLast = iReg + 
11420 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75  nReg - 1;.  stru
11430 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
11440 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
11450 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
11460 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
11470 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11480 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
11490 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
114a0 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73  =iReg && r<=iLas
114b0 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  t ){.      cache
114c0 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
114d0 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
114e0 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
114f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
11500 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e  ember the curren
11510 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63  t column cache c
11520 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77  ontext.  Any new
11530 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a   entries added.*
11540 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  * added to the c
11550 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65  olumn cache afte
11560 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20  r this call are 
11570 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65  removed when the
11580 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
11590 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f  g pop occurs..*/
115a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
115b0 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65  rCachePush(Parse
115c0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
115d0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
115e0 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  ++;.}../*.** Rem
115f0 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
11600 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
11610 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
11620 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
11630 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
11640 4e 20 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e  N Push operation
11650 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
11660 64 73 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20  ds, restore the 
11670 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20  cache.** to the 
11680 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
11690 4e 20 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f  N Pushes ago..*/
116a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
116b0 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20  rCachePop(Parse 
116c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b  *pParse, int N){
116d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
116e0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
116f0 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 29  .  assert( N>0 )
11700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
11710 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
11720 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =N );.  pParse->
11730 69 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e  iCacheLevel -= N
11740 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
11750 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11760 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11770 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11780 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
11790 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70  g && p->iLevel>p
117a0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
117b0 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  el ){.      cach
117c0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
117d0 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
117e0 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
117f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
11800 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75  en a cached colu
11810 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61  mn is reused, ma
11820 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73  ke sure that its
11830 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
11840 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61  no longer availa
11850 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65  ble as a temp re
11860 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20  gister.  ticket 
11870 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d  #3879:  that sam
11880 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69  e.** register mi
11890 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  ght be in the ca
118a0 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  che in multiple 
118b0 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75  places, so be su
118c0 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65  re to.** get the
118d0 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  m all..*/.static
118e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
118f0 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
11900 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
11910 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
11920 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
11930 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
11940 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11950 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11960 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
11970 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11980 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
11990 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65  g ){.      p->te
119a0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  mpReg = 0;.    }
119b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
119c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
119d0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
119e0 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
119f0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
11a00 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
11a10 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
11a20 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
11a30 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
11a40 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
11a50 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
11a60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11a70 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
11a80 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
11a90 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
11aa0 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
11ab0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20  cursor for this 
11ac0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
11ad0 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
11ae0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
11af0 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
11b00 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
11b10 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
11b20 20 76 61 6c 75 64 20 69 6e 74 6f 20 74 68 69 73   valud into this
11b30 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
11b40 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
11b50 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
11b60 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
11b70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11b80 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
11b90 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
11ba0 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
11bb0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
11bc0 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
11bd0 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
11be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11bf0 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
11c00 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
11c10 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
11c20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
11c30 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
11c40 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  pTab, iCol, regO
11c50 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
11c60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11c70 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
11c80 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
11c90 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
11ca0 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
11cb0 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
11cc0 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73  value in a regis
11cd0 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a  ter.  An effort.
11ce0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  ** is made to st
11cf0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
11d00 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
11d10 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20   iReg, but this 
11d20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e  is.** not guaran
11d30 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74  teed.  The locat
11d40 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ion of the colum
11d50 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  n value is retur
11d60 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ned..**.** There
11d70 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
11d80 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
11d90 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
11da0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
11db0 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
11dc0 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
11dd0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
11de0 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
11df0 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
11e00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
11e10 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
11e20 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
11e30 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
11e40 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
11e50 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
11e60 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
11e70 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
11e80 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
11e90 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
11ea0 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
11eb0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
11ec0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
11ed0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
11ee0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
11ef0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
11f00 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
11f10 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg         /* S
11f20 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
11f30 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
11f40 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11f50 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
11f60 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
11f70 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
11f80 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
11f90 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
11fa0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
11fb0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
11fc0 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
11fd0 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
11fe0 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
11ff0 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
12000 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
12010 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
12020 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
12030 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
12040 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
12050 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
12060 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
12070 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12080 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
12090 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
120a0 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
120b0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
120c0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
120d0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
120e0 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  se, iTable, iCol
120f0 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 72 65  umn, iReg);.  re
12100 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
12110 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
12120 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
12130 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
12140 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
12150 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  r(Parse *pParse)
12160 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
12170 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
12180 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
12190 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
121a0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
121b0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
121c0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
121d0 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
121e0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
121f0 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
12200 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
12210 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
12220 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
12230 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  at an affinity c
12240 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
12250 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20  ed on iCount.** 
12260 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
12270 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a  ng with iStart..
12280 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12290 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
122a0 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  Change(Parse *pP
122b0 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74  arse, int iStart
122c0 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20  , int iCount){. 
122d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
122e0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
122f0 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b  iStart, iCount);
12300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
12310 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
12320 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
12330 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
12340 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
12350 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
12360 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65  nReg-1. Keep the
12370 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70   column cache up
12380 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  -to-date..*/.voi
12390 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
123a0 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  eMove(Parse *pPa
123b0 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
123c0 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
123d0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
123e0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
123f0 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  *p;.  if( NEVER(
12400 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65  iFrom==iTo) ) re
12410 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
12420 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
12430 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
12440 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
12450 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  eg);.  for(i=0, 
12460 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
12470 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
12480 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
12490 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ++){.    int x =
124a0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
124b0 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c  ( x>=iFrom && x<
124c0 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20  iFrom+nReg ){.  
124d0 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69      p->iReg += i
124e0 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a  To-iFrom;.    }.
124f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
12500 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
12510 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  py content from 
12520 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
12530 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
12540 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
12550 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f  To+nReg-1..*/.vo
12560 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
12570 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
12580 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
12590 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
125a0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
125b0 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d  if( NEVER(iFrom=
125c0 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a  =iTo) ) return;.
125d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
125e0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  g; i++){.    sql
125f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
12600 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
12610 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20  _Copy, iFrom+i, 
12620 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  iTo+i);.  }.}..#
12630 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
12640 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
12650 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
12660 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
12670 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
12680 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
12690 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
126a0 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
126b0 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
126c0 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
126d0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
126e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
126f0 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
12700 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
12710 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
12720 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
12730 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
12740 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
12750 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
12760 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
12770 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
12780 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
12790 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
127a0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
127b0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
127c0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
127d0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
127e0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
127f0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
12800 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
12810 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
12820 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
12830 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
12840 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
12850 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
12860 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
12870 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  GE_TEST */../*.*
12880 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12890 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
128a0 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
128b0 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
128c0 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
128d0 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
128e0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
128f0 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
12900 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
12910 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
12920 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
12930 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
12940 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
12950 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
12960 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
12970 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
12980 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
12990 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
129a0 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
129b0 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
129c0 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
129d0 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
129e0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
129f0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
12a00 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
12a10 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
12a20 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
12a30 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
12a40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12a50 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
12a60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
12a70 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
12a80 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
12a90 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
12aa0 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
12ab0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12ac0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
12af0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
12b00 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
12b10 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
12b20 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
12b30 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
12b40 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
12b50 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
12b60 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
12b70 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
12b80 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
12b90 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
12ba0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
12bb0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
12bc0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
12bd0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
12be0 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20  r2, r3, r4;     
12bf0 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
12c00 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
12c10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12c20 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
12c30 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
12c40 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73  nection */..  as
12c50 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
12c60 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
12c70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
12c80 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
12c90 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
12ca0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12cb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12cc0 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
12cd0 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
12ce0 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
12cf0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
12d00 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
12d10 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
12d20 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
12d30 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
12d40 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
12d50 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
12d60 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
12d70 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
12d80 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
12d90 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
12da0 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
12db0 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
12dc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12dd0 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
12de0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
12df0 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
12e00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12e10 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
12e20 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
12e30 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
12e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12e50 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
12e60 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
12e70 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
12ea0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
12eb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
12ed0 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
12ee0 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
12ef0 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
12f00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12f10 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
12f20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
12f30 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
12f40 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
12f50 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
12f60 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
12f70 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
12f80 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
12f90 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Base>0 );.      
12fa0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
12fb0 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
12fc0 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
12fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12fe0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
12ff0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
13000 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13010 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
13040 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
13050 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
13060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13070 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13080 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
13090 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
130a0 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
130b0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
130c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
130d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
130e0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
130f0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
13100 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
13110 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
13120 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13130 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
13140 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
13150 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13160 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
13170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13180 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
13190 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
131a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
131b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
131c0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
131d0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
131e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
131f0 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
13200 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
13210 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
13220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
13240 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
13250 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13260 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
13270 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13280 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
132a0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
132b0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
132c0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
132d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
132e0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
132f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13300 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13310 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
13320 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
13330 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
13340 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
13350 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13360 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
13370 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13380 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
13390 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
133a0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
133b0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
133c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
133d0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
133e0 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
133f0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
13400 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
13410 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
13420 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
13430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13440 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
13450 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
13460 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
13470 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13480 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13490 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
134a0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
134b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
134c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
134d0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
134e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
134f0 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
13500 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
13510 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
13520 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
13530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13540 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
13550 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
13560 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
13570 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13580 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
13590 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
135a0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 45 78  ngeP4(v, -1, pEx
135b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
135c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
135d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
135e0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
135f0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
13600 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
13610 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13620 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13630 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
13640 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
13650 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
13660 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13670 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13680 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13690 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
136a0 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
136b0 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
136c0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
136d0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
136e0 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
136f0 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
13700 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
13710 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
13720 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13730 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13740 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
13750 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
13760 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
13770 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
13780 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) );.      aff =
13790 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
137a0 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
137b0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f  oken);.      to_
137c0 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54  op = aff - SQLIT
137d0 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f  E_AFF_TEXT + OP_
137e0 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73  ToText;.      as
137f0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13800 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66  ToText    || aff
13810 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
13820 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  T    );.      as
13830 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13840 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66  ToBlob    || aff
13850 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
13860 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  E    );.      as
13870 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13880 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
13890 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
138a0 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
138b0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
138c0 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66  ToInt     || aff
138d0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  !=SQLITE_AFF_INT
138e0 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73  EGER );.      as
138f0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13900 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66  ToReal    || aff
13910 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  !=SQLITE_AFF_REA
13920 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65  L    );.      te
13930 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
13940 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20  P_ToText );.    
13950 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
13960 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a  p==OP_ToBlob );.
13970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13980 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
13990 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ric );.      tes
139a0 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
139b0 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  _ToInt );.      
139c0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
139d0 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20  =OP_ToReal );.  
139e0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
139f0 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
13a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13a10 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
13a20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
13a30 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
13a40 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
13a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a60 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70  eAddOp1(v, to_op
13a70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
13a80 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
13a90 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
13aa0 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
13ab0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
13ac0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13ad0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
13ae0 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
13af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13b00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13b10 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
13b20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
13b30 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
13b40 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
13b50 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
13b60 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
13b70 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
13b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13b90 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
13ba0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
13bb0 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
13bc0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
13bd0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
13be0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
13bf0 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
13c00 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
13c10 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
13c20 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
13c30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13c40 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
13c50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13c60 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
13c70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13c80 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
13c90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13ca0 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
13cb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
13cc0 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
13cd0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
13ce0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
13cf0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
13d00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13d10 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
13d20 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
13d30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
13d40 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
13d50 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
13d60 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
13d70 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
13d80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
13d90 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
13dc0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
13dd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13de0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
13df0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13e00 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
13e10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13e20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
13e30 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
13e40 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
13e50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
13e60 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
13e70 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
13e80 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
13e90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13ea0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
13eb0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
13ec0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
13ed0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13ee0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
13ef0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
13f00 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
13f10 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
13f20 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
13f30 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
13f40 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
13f50 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
13f60 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
13f80 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
13f90 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c  TE_STOREP2 | SQL
13fa0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
13fb0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
13fc0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
13fd0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
13fe0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
13ff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14000 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
14010 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
14020 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
14030 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
14040 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
14050 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
14060 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
14070 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
14080 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
14090 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
140a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
140b0 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
140c0 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
140d0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
140e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
140f0 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
14100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14110 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
14120 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
14130 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
14140 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14150 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
14160 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
14170 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
14180 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
14190 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
141a0 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
141b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
141c0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
141d0 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
141e0 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
141f0 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
14200 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
14210 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
14220 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14230 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
14240 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
14250 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
14260 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
14270 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14280 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
14290 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
142a0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
142b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
142c0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
142d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
142e0 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
142f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14300 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
14310 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14320 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
14330 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14340 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
14350 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14360 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
14370 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14380 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
14390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
143a0 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
143b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
143c0 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
143d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
143e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
143f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14400 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14410 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14420 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14430 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14440 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
14450 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14460 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
14470 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
14480 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14490 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
144a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
144b0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
144c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
144d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
144e0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
144f0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14500 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
14510 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
14520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
14530 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
14540 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
14550 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
14560 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
14570 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  et);.#ifndef SQL
14580 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
14590 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
145a0 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
145b0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
145c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
145d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
145e0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
145f0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
14600 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
14610 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
14620 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20  arget);.#endif. 
14630 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14640 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72      regFree1 = r
14650 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
14660 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
14670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14680 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14690 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a  nteger, 0, r1);.
146a0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
146b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
146c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
146d0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
146e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
146f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14700 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
14710 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
14720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14730 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
14750 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
14760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14770 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
14780 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
14790 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
147a0 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
147b0 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20  OP_BitNot );.   
147c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
147d0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20  T==OP_Not );.   
147e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
147f0 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
14800 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14810 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
14820 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
14830 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14840 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14850 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
14860 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14870 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14880 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
14890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
148a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
148b0 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
148c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
148d0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
148e0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
148f0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
14900 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
14910 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
14920 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
14930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14940 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
14950 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74  tNull );.      t
14960 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14970 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
14980 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14990 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
149a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
149b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
149c0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
149d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
149e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
149f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14a00 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
14a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14a20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14a30 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14a40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14a50 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
14a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
14a80 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20  target, -1);.   
14a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14aa0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
14ab0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14ac0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14ad0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
14ae0 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
14af0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
14b00 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
14b10 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
14b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
14b30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14b40 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
14b50 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e) );.        sq
14b60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14b70 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
14b80 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29   aggregate: %s()
14b90 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
14ba0 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
14bb0 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
14bc0 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
14bd0 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
14be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14bf0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14c00 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
14c10 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
14c20 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
14c30 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
14c40 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
14c50 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
14c60 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
14c70 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
14c80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14c90 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
14ca0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
14cb0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
14cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
14cd0 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
14ce0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
14cf0 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
14d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
14d10 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74  gth of the funct
14d20 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  ion name in byte
14d30 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  s */.      const
14d40 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
14d50 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
14d60 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
14d70 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
14d80 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
14d90 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
14da0 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
14db0 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
14dc0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
14dd0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
14de0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
14df0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
14e00 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
14e10 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
14e20 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
14e30 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
14e40 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
14e50 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
14e60 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
14e70 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
14e80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14e90 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
14ea0 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ) );.      testc
14eb0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53  ase( op==TK_CONS
14ec0 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20  T_FUNC );.      
14ed0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14ee0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
14ef0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e     if( ExprHasAn
14f00 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
14f10 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
14f20 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
14f30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
14f40 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
14f50 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
14f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14f70 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
14f80 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
14f90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14fa0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14fb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
14fc0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
14fd0 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
14fe0 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
14ff0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15000 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
15010 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
15020 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
15030 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
15040 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15050 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
15060 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15070 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
15080 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  own function: %.
15090 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
150a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
150b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
150c0 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
150d0 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
150e0 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
150f0 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
15100 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
15110 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
15120 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
15130 63 65 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f  cessary evalatio
15140 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
15150 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
15160 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
15170 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
15180 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
15190 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
151a0 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
151b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
151c0 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
151d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
151e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
151f0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
15200 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15210 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
15220 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
15230 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
15240 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
15250 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
15260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15270 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15280 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
15290 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
152a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
152b0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
152c0 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
152d0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
152e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
152f0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
15300 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15310 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
15320 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
15330 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15340 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15350 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
15360 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
15370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15380 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15390 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
153a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
153b0 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66      }...      if
153c0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
153d0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
153e0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
153f0 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
15400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15410 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
15420 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
15430 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
15440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15450 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
15460 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
15470 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 1);.        s
15480 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15490 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20  op(pParse, 1);  
154a0 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
154b0 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
154c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
154d0 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
154e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
154f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15500 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
15510 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
15520 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
15530 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
15540 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
15550 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
15560 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
15570 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
15580 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
15590 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
155a0 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
155b0 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
155c0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
155d0 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
155e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
155f0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
15600 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
15610 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
15620 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
15630 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
15640 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
15650 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
15660 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
15670 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
15680 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
15690 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
156a0 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
156b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
156c0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
156d0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
156e0 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
156f0 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
15700 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
15710 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
15720 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
15730 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
15740 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
15750 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
15760 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
15770 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
15780 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
15790 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
157a0 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
157b0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
157c0 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
157d0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
157e0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
157f0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
15800 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
15810 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
15820 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15830 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
15840 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
15850 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
15860 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
15870 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
15880 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
15890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
158a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
158b0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
158c0 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
158d0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
158e0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
158f0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
15900 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
15910 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20   (1<<i);.       
15920 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
15930 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
15940 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
15950 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
15960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
15970 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
15980 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
15990 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
159a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
159b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
159c0 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53   pDef->flags & S
159d0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
159e0 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
159f0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
15a00 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15a10 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
15a20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15a30 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
15a40 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
15a50 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
15a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a80 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
15a90 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
15aa0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
15ad0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
15ae0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15af0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
15b00 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
15b10 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  arg ){.        s
15b20 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15b30 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
15b40 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
15b50 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
15b60 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
15b70 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15b80 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
15b90 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
15ba0 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
15bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15bc0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
15bd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15be0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
15bf0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
15c00 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
15c10 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
15c20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
15c30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15c40 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
15c50 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
15c60 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
15c70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15c80 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
15c90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
15ca0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15cb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15cc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15cd0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15cf0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
15d00 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
15d10 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
15d20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15d30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
15d40 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
15d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15d60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15d70 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
15d80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15d90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
15da0 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
15db0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15dc0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15dd0 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
15de0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15df0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
15e00 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15e10 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20  RY */...    /*. 
15e20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
15e30 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
15e40 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
15e50 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
15e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
15e70 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
15e80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
15e90 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
15ea0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
15eb0 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
15ec0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
15ed0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
15ee0 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
15ef0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
15f00 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
15f10 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
15f20 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
15f30 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
15f40 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
15f50 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
15f60 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
15f70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b  xpr->x.pList->a;
15f80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
15f90 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
15fa0 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d  xpr;..      r1 =
15fb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15fc0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
15fd0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
15fe0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15ff0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16000 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
16010 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
16020 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16030 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
16040 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16050 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e2==0 );.      r
16060 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
16070 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16080 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65       r4 = sqlite
16090 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
160a0 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  se);.      codeC
160b0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
160c0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
160d0 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _Ge,.           
160e0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72         r1, r2, r
160f0 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  3, SQLITE_STOREP
16100 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  2);.      pLItem
16110 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
16120 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
16130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16140 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16150 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
16160 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
16170 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16180 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
16190 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
161a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
161b0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
161c0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
161d0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
161e0 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
161f0 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54  2, r4, SQLITE_ST
16200 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71  OREP2);.      sq
16210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16220 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
16230 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  4, target);.    
16240 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16250 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16260 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r3);.      sqlit
16270 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16280 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20  (pParse, r4);.  
16290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
162a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
162b0 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
162c0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
162d0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
162e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
162f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
16300 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16310 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
16320 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
16330 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
16340 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
16350 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
16360 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
16370 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
16380 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
16390 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
163a0 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
163b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
163c0 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
163d0 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
163e0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
163f0 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
16400 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
16410 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
16420 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
16430 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
16440 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
16450 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
16460 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
16470 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
16480 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
16490 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
164a0 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
164b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
164c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
164d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
164e0 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
164f0 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
16500 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
16510 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
16520 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
16530 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
16540 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
16550 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
16560 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
16570 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
16580 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
16590 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
165a0 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
165b0 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
165c0 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
165d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
165e0 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
165f0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
16600 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
16610 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
16620 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
16630 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
16640 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
16650 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
16660 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
16670 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
16680 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
16690 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
166a0 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
166b0 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
166c0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
166d0 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
166e0 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
166f0 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
16700 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
16710 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16720 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
16730 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
16740 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
16750 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
16760 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
16770 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16780 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
16790 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
167a0 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
167b0 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
167c0 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
167d0 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
167e0 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
167f0 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
16800 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
16810 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
16820 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
16830 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
16840 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
16850 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
16860 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
16870 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
16880 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
16890 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
168a0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
168b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
168c0 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
168d0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
168e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
168f0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
16900 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
16910 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
16920 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
16930 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
16940 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
16950 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
16960 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
16970 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
16980 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
16990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
169a0 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
169b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
169c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
169d0 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
169e0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
169f0 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
16a00 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
16a10 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
16a20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
16a30 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
16a40 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
16a50 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
16a60 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
16a70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16a80 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
16a90 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
16aa0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
16ab0 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
16ac0 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
16ad0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
16ae0 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
16af0 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
16b00 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
16b10 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
16b20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  real.  */.      
16b30 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
16b40 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
16b50 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
16b60 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
16b70 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
16b80 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
16b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16ba0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
16bb0 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
16bc0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
16bd0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
16be0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
16bf0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
16c00 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
16c10 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
16c20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
16c30 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
16c40 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
16c50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
16c60 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
16c70 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
16c80 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
16c90 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
16ca0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
16cb0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
16cc0 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
16cd0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
16ce0 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
16cf0 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
16d00 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
16d10 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
16d20 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
16d30 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
16d40 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
16d50 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
16d60 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
16d70 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
16d80 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
16d90 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
16da0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52   is in pExpr->pR
16db0 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20  ight.  The Y is 
16dc0 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
16dd0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  If there is no. 
16de0 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73     ** ELSE claus
16df0 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74  e and no other t
16e00 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65  erm matches, the
16e10 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
16e20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73  the.    ** exprs
16e30 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sion is NULL..  
16e40 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
16e50 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
16e60 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
16e70 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
16e80 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
16e90 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
16ea0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16eb0 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
16ec0 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
16ed0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
16ee0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
16ef0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
16f00 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
16f10 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
16f20 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
16f30 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
16f40 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
16f50 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
16f60 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
16f70 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
16f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
16f90 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
16fa0 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
16fb0 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
16fc0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
16fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
16fe0 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
16ff0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
17000 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
17030 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
17040 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
17050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17070 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
17080 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
17090 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
170a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
170b0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
170c0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
170d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
170e0 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
170f0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
17100 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
17110 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
17120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17130 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
17140 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
17150 20 63 61 63 68 65 58 3b 20 20 20 20 20 20 20 20   cacheX;        
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17170 20 43 61 63 68 65 64 20 65 78 70 72 65 73 73 69   Cached expressi
17180 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78  on X */.      Ex
17190 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
171c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
171d0 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171f0 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
17200 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
17210 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
17220 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
17230 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
17240 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
17250 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
17260 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17270 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
17280 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
17290 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
172a0 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
172b0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  x.pList->nExpr %
172c0 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
172d0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
172e0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
172f0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
17300 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
17310 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
17320 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
17330 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
17340 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
17350 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
17360 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17370 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
17380 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
17390 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
173a0 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70 58 3b     cacheX = *pX;
173b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
173c0 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
173d0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
173e0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
173f0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
17400 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
17410 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
17420 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17430 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
17440 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e1);.        tes
17450 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17460 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  =0 );.        ca
17470 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  cheX.op = TK_REG
17480 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20 6f  ISTER;.        o
17490 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
174a0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
174b0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
174c0 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20  cacheX;.        
174d0 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
174e0 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
174f0 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
17500 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
17510 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
17520 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
17530 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
17540 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
17550 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
17560 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
17570 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
17580 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
17590 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
175a0 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
175b0 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
175c0 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
175d0 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
175e0 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
175f0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
17600 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
17610 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
17620 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
17630 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
17640 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
17650 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
17660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17670 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
17680 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
17690 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
176a0 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
176b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
176c0 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
176d0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
176e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
176f0 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
17700 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17710 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
17720 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
17730 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
17740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17750 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
17760 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
17770 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
17780 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
17790 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
177a0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
177b0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
177c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
177d0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
177e0 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
177f0 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
17800 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17810 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
17820 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
17830 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
17840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17850 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
17860 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  , 0, endLabel);.
17870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17880 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
17890 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  se, 1);.        
178a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
178b0 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
178c0 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
178d0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
178e0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
178f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17900 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
17910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17920 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
17930 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
17940 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
17950 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17960 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
17970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17990 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
179a0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
179b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
179c0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
179d0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
179e0 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20  nErr>0 .        
179f0 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43     || pParse->iC
17a00 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68  acheLevel==iCach
17a10 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  eLevel );.      
17a20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17a30 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
17a40 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
17a50 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
17a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
17a70 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
17a80 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
17a90 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
17aa0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
17ab0 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
17ac0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
17ad0 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
17ae0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
17af0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
17b00 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
17b10 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
17b20 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
17b30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
17b40 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
17b50 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
17b60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17b70 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b90 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
17ba0 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
17bb0 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
17bc0 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
17bd0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
17be0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17bf0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
17c00 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
17c10 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
17c20 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
17c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
17c40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17c50 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
17c60 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
17c70 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
17c80 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
17c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17ca0 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
17cb0 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
17cc0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
17cd0 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
17ce0 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
17cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17d00 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
17d10 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
17d20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
17d30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
17d40 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  n, 0);.      }..
17d50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17d60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
17d70 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17d80 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
17d90 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
17da0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17db0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
17dc0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
17dd0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
17de0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
17df0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
17e00 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
17e10 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
17e20 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
17e30 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
17e40 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
17e50 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
17e60 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
17e70 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
17e80 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
17e90 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
17ea0 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
17eb0 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
17ec0 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
17ed0 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
17ee0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
17ef0 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
17f00 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
17f10 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
17f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
17f30 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
17f40 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
17f50 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
17f60 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
17f70 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17f80 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32  Parse);.  int r2
17f90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17fa0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
17fb0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69   pExpr, r1);.  i
17fc0 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
17fd0 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d   *pReg = r1;.  }
17fe0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
17ff0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18000 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
18010 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a   *pReg = 0;.  }.
18020 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
18030 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
18040 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
18050 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
18060 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
18070 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
18080 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
18090 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
180a0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
180b0 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
180c0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
180d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
180e0 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
180f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
18100 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
18110 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
18120 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
18130 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
18140 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
18150 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
18160 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
18170 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
18180 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
18190 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
181a0 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
181b0 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
181c0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
181d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
181e0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
181f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18200 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
18210 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61  se->pVdbe || pPa
18220 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
18230 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
18240 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
18250 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
18260 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18270 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
18280 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
18290 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
182a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
182b0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d  return target;.}
182c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
182d0 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
182e0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
182f0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
18300 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
18310 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
18320 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
18330 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
18340 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
18350 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
18360 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
18370 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
18380 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18390 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
183a0 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
183b0 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
183c0 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
183d0 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
183e0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
183f0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
18400 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
18410 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
18420 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
18430 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
18440 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
18450 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
18460 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
18470 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
18480 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
18490 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
184a0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
184b0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
184c0 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
184d0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
184e0 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69    int inReg;.  i
184f0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
18500 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
18510 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
18520 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
18530 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 72  0 );.  /* This r
18540 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18550 20 66 6f 72 20 74 65 72 6d 73 20 74 6f 20 49 4e   for terms to IN
18560 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 2e 20  SERT or UPDATE. 
18570 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a 20 20   And the only.  
18580 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63 65 20 77  ** other place w
18590 68 65 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73  here expressions
185a0 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65   can be converte
185b0 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49 53 54  d into TK_REGIST
185c0 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20 57 48  ER is.  ** in WH
185d0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
185e0 73 73 69 6e 67 2e 20 20 53 6f 20 61 73 20 63 75  ssing.  So as cu
185f0 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d 65 6e  rrently implemen
18600 74 65 64 2c 20 74 68 65 72 65 20 69 73 0a 20 20  ted, there is.  
18610 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20 61 20  ** no way for a 
18620 54 4b 5f 52 45 47 49 53 54 45 52 20 74 6f 20 65  TK_REGISTER to e
18630 78 69 73 74 20 68 65 72 65 2e 20 20 42 75 74 20  xist here.  But 
18640 69 74 20 73 65 65 6d 73 20 70 72 75 64 65 6e 74  it seems prudent
18650 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 74 68   to.  ** keep th
18660 65 20 41 4c 57 41 59 53 28 29 20 69 6e 20 63 61  e ALWAYS() in ca
18670 73 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  se the condition
18680 73 20 61 62 6f 76 65 20 63 68 61 6e 67 65 20 77  s above change w
18690 69 74 68 20 66 75 74 75 72 65 0a 20 20 2a 2a 20  ith future.  ** 
186a0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 6f 72  modifications or
186b0 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e 20 2a   enhancements. *
186c0 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
186d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
186e0 49 53 54 45 52 29 20 29 7b 20 20 0a 20 20 20 20  ISTER) ){  .    
186f0 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d  int iMem;.    iM
18700 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
18710 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
18720 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18730 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d  _Copy, inReg, iM
18740 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  em);.    pExpr->
18750 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20  iTable = iMem;. 
18760 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
18770 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
18780 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
18790 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65  GISTER;.  }.  re
187a0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
187b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
187c0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20   if pExpr is an 
187d0 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
187e0 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
187f0 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66  opriate.** for f
18800 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
18810 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72  a loop.  Appropr
18820 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  iate expressions
18830 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a   are:.**.**    *
18840 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
18850 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
18860 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  to two or more o
18870 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pcodes..**.**   
18880 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67   *  Any OP_Integ
18890 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f  er, OP_Real, OP_
188a0 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c  String, OP_Blob,
188b0 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20   OP_Null, .**   
188c0 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62      or OP_Variab
188d0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
188e0 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63   need to be plac
188f0 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ed in a .**     
18900 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73    specific regis
18910 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ter..**.** There
18920 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
18930 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69  factoring out si
18940 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
18950 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
18960 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65  ressions that ne
18970 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
18980 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
18990 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57  register.  .** W
189a0 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74  e could factor t
189b0 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65  hem out, but the
189c0 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75  n we would end u
189d0 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f  p adding an.** O
189e0 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74  P_SCopy instruct
189f0 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ion to move the 
18a00 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63  value into the c
18a10 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a  orrect register.
18a20 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69  ** later.  We mi
18a30 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74  ght as well just
18a40 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   use the origina
18a50 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  l instruction an
18a60 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f  d.** avoid the O
18a70 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74  P_SCopy..*/.stat
18a80 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72  ic int isAppropr
18a90 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
18aa0 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
18ab0 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
18ac0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
18ad0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18ae0 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73  0;  /* Only cons
18af0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
18b00 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
18b10 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a   for factoring *
18b20 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
18b30 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  flags & EP_Fixed
18b40 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Dest)==0 ){.    
18b50 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e  return 1;  /* An
18b60 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f  y constant witho
18b70 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ut a fixed desti
18b80 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70  nation is approp
18b90 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77  riate */.  }.  w
18ba0 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
18bb0 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70  UPLUS ) p = p->p
18bc0 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Left;.  switch( 
18bd0 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  p->op ){.#ifndef
18be0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
18bf0 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
18c00 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64  se TK_BLOB:.#end
18c10 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
18c20 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73  ARIABLE:.    cas
18c30 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
18c40 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
18c50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
18c60 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  L:.    case TK_S
18c70 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74  TRING: {.      t
18c80 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
18c90 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  TK_BLOB );.     
18ca0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
18cb0 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b  ==TK_VARIABLE );
18cc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18cd0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47   p->op==TK_INTEG
18ce0 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ER );.      test
18cf0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
18d00 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74  FLOAT );.      t
18d10 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
18d20 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TK_NULL );.     
18d30 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
18d40 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
18d50 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69       /* Single-i
18d60 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
18d70 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65  ants with a fixe
18d80 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72  d destination ar
18d90 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  e.      ** bette
18da0 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20  r done in-line. 
18db0 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68   If we factor th
18dc0 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75  em, they will ju
18dd0 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20  st end.      ** 
18de0 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  up generating an
18df0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76   OP_SCopy to mov
18e00 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74  e the value to t
18e10 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
18e20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72       ** register
18e30 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
18e40 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 0;.    }.    c
18e50 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
18e60 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
18e70 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
18e80 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
18e90 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
18ea0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18eb0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
18ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18ed0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
18ee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18ef0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
18f00 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
18f10 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  r is a constant 
18f20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
18f30 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
18f40 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20  or.** factoring 
18f50 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74  out of a loop, t
18f60 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
18f70 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
18f80 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
18f90 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  nd convert the e
18fa0 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61  xpression into a
18fb0 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20   TK_REGISTER.** 
18fc0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
18fd0 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f  tatic int evalCo
18fe0 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  nstExpr(Walker *
18ff0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
19000 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a  Expr){.  Parse *
19010 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
19020 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74  ->pParse;.  swit
19030 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
19040 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
19050 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
19060 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
19070 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
19080 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19090 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
190a0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
190b0 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
190c0 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b  TK_CONST_FUNC: {
190d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72  .      /* The ar
190e0 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e  guments to a fun
190f0 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78  ction have a fix
19100 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  ed destination..
19110 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68        ** Mark th
19120 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61  em this way to a
19130 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75  void generated u
19140 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79  nneeded OP_SCopy
19150 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  .      ** instru
19160 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a  ctions. .      *
19170 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
19180 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
19190 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
191a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
191b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
191c0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
191d0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
191e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
191f0 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  i = pList->nExpr
19200 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
19210 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19220 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61  pItem = pList->a
19230 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
19240 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
19250 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
19260 28 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e  ( ALWAYS(pItem->
19270 70 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e  pExpr) ) pItem->
19280 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
19290 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20  EP_FixedDest;.  
192a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
192b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
192c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41   }.  }.  if( isA
192d0 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
192e0 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b  toring(pExpr) ){
192f0 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b  .    int r1 = ++
19300 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19310 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32    int r2;.    r2
19320 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19330 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
19340 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
19350 20 69 66 28 20 4e 45 56 45 52 28 72 31 21 3d 72   if( NEVER(r1!=r
19360 32 29 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  2) ) sqlite3Rele
19370 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19380 65 2c 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70  e, r1);.    pExp
19390 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e  r->op2 = pExpr->
193a0 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  op;.    pExpr->o
193b0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
193c0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
193d0 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74  le = r2;.    ret
193e0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
193f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
19400 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
19410 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20 63  ** Preevaluate c
19420 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
19430 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45  ssions within pE
19440 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
19450 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
19460 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69  registers.  Modi
19470 66 79 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  fy pExpr so that
19480 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75   the constant su
19490 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61  bexpresions.** a
194a0 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f  re TK_REGISTER o
194b0 70 63 6f 64 65 73 20 74 68 61 74 20 72 65 66 65  pcodes that refe
194c0 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70  r to the precomp
194d0 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  uted values..**.
194e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
194f0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
19500 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f  e jump to the co
19510 6f 6b 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20  okie-check code 
19520 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  has.** already o
19530 63 63 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65  ccur.  Since the
19540 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75   cookie-check ju
19550 6d 70 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  mp is generated 
19560 70 72 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20  prior to.** any 
19570 6f 74 68 65 72 20 73 65 72 69 6f 75 73 20 70 72  other serious pr
19580 6f 63 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63  ocessing, this c
19590 68 65 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61  heck ensures tha
195a0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a  t there is no.**
195b0 20 77 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74   way to accident
195c0 6c 79 20 62 79 70 61 73 73 20 74 68 65 20 63 6f  ly bypass the co
195d0 6e 73 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a  nstant initializ
195e0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
195f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
19600 73 6f 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  so a no-op if th
19610 65 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  e SQLITE_FactorO
19620 75 74 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61  utConst optimiza
19630 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62  tion.** is disab
19640 6c 65 64 20 76 69 61 20 74 68 65 20 73 71 6c 69  led via the sqli
19650 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
19660 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19670 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a  _OPTIMIZATIONS).
19680 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54  ** interface.  T
19690 68 69 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20  his allows test 
196a0 6c 6f 67 69 63 20 74 6f 20 76 65 72 69 66 79 20  logic to verify 
196b0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e  that the same an
196c0 73 77 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69  swer is.** obtai
196d0 6e 65 64 20 66 6f 72 20 71 75 65 72 69 65 73 20  ned for queries 
196e0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
196f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e  ether or not con
19700 73 74 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72  stants are.** pr
19710 65 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72  ecomputed into r
19720 65 67 69 73 74 65 72 73 20 6f 72 20 69 66 20 74  egisters or if t
19730 68 65 79 20 61 72 65 20 69 6e 73 65 72 74 65 64  hey are inserted
19740 20 69 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69   in-line..*/.voi
19750 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
19760 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65  eConstants(Parse
19770 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
19780 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
19790 20 77 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   w;.  if( pParse
197a0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72  ->cookieGoto ) r
197b0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 50  eturn;.  if( (pP
197c0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
197d0 26 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  & SQLITE_FactorO
197e0 75 74 43 6f 6e 73 74 29 21 3d 30 20 29 20 72 65  utConst)!=0 ) re
197f0 74 75 72 6e 3b 0a 20 20 77 2e 78 45 78 70 72 43  turn;.  w.xExprC
19800 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f  allback = evalCo
19810 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65  nstExpr;.  w.xSe
19820 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
19830 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
19840 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
19850 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
19860 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  pr);.}.../*.** G
19870 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
19880 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
19890 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
198a0 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
198b0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
198c0 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
198d0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
198e0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
198f0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
19900 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19910 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
19920 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
19930 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
19940 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
19950 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
19960 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
19970 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19980 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
19990 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
199a0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
199b0 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
199c0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
199d0 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
199e0 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20  nt doHardCopy   
199f0 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64    /* Make a hard
19a00 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65   copy of every e
19a10 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  lement */.){.  s
19a20 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
19a30 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
19a40 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  t i, n;.  assert
19a50 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
19a60 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
19a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19a80 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29  arse->pVdbe!=0 )
19a90 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73  ;  /* Never gets
19aa0 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77   this far otherw
19ab0 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69  ise */.  n = pLi
19ac0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
19ad0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
19ae0 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
19af0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
19b00 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
19b10 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  m->pExpr;.    in
19b20 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65  t inReg = sqlite
19b30 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
19b40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
19b50 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66  arget+i);.    if
19b60 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
19b70 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
19b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
19b90 72 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f 48 61  rse->pVdbe, doHa
19ba0 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f 70 79  rdCopy ? OP_Copy
19bb0 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20   : OP_SCopy,.   
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 20 20 20 69 6e 52 65 67 2c 20 74 61 72 67       inReg, targ
19be0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  et+i);.    }.  }
19bf0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
19c00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
19c10 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
19c20 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
19c30 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
19c40 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
19c50 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
19c60 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
19c70 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
19c80 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
19c90 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
19ca0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
19cb0 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
19cc0 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f  n.** elementatio
19cd0 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69  n of x..*/.stati
19ce0 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
19cf0 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
19d00 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
19d10 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
19d20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19d30 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
19d40 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
19d50 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
19d60 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
19d70 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
19d80 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a  mp here if the j
19d90 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  ump is taken */.
19da0 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65    int jumpIfTrue
19db0 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20  ,   /* Take the 
19dc0 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
19dd0 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  EEN is true */. 
19de0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
19df0 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
19e00 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
19e10 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
19e20 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  .  Expr exprAnd;
19e30 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
19e40 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
19e50 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
19e60 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
19e70 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
19e80 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
19e90 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
19ea0 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
19eb0 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b  */.  Expr exprX;
19ec0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78         /* The  x
19ed0 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20    subexpression 
19ee0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
19ef0 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
19f00 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
19f10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
19f20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19f30 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
19f40 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
19f50 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
19f60 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
19f70 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
19f80 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
19f90 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
19fa0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
19fb0 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
19fc0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
19fd0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
19fe0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
19ff0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
1a000 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1a010 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
1a020 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
1a030 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
1a040 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
1a050 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
1a060 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1a070 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
1a080 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
1a090 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1a0a0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
1a0b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78  &regFree1);.  ex
1a0c0 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
1a0d0 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70  STER;.  if( jump
1a0e0 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71  IfTrue ){.    sq
1a0f0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1a100 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1a110 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1a120 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
1a130 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1a140 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
1a150 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1a160 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
1a170 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a180 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a190 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
1a1a0 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
1a1b0 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
1a1c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a1d0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1a1e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1a1f0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1a200 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a210 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1a220 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1a230 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1a240 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a250 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1a260 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1a270 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1a280 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1a290 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1a2a0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1a2b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a2c0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1a2d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1a2e0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1a2f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1a300 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1a310 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1a320 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1a330 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a340 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1a350 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1a360 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1a370 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1a380 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1a390 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1a3a0 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=0 );.}../*.**
1a3b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1a3c0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1a3d0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1a3e0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1a3f0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1a400 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1a410 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
1a420 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1a430 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1a440 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1a450 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1a460 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
1a470 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1a480 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1a490 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1a4a0 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
1a4b0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
1a4c0 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
1a4d0 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
1a4e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
1a4f0 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
1a500 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1a510 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
1a520 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
1a530 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
1a540 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
1a550 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
1a560 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
1a570 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
1a580 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
1a590 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
1a5a0 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
1a5b0 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
1a5c0 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
1a5d0 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
1a5e0 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
1a5f0 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
1a600 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
1a610 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
1a620 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1a630 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
1a640 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
1a650 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1a660 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
1a670 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1a680 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1a690 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1a6a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1a6b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1a6c0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1a6d0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1a6e0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1a6f0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1a700 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1a710 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1a720 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1a730 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1a740 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1a750 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
1a760 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
1a770 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1a780 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
1a790 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
1a7a0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
1a7b0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
1a7c0 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
1a7d0 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
1a7e0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1a7f0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1a800 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1a810 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a820 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a830 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1a840 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a850 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a860 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1a870 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1a880 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a890 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
1a8a0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1a8b0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1a8c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1a8d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a8e0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1a8f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1a900 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a910 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
1a920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a930 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1a940 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
1a950 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a960 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
1a970 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a980 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1a990 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1a9a0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1a9b0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1a9c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1a9d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a9e0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1a9f0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1aa00 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1aa10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aa20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1aa30 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1aa40 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1aa50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1aa60 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1aa70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1aa80 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1aa90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1aaa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1aab0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1aac0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1aad0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1aae0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1aaf0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1ab00 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1ab10 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1ab20 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
1ab30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
1ab40 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
1ab50 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
1ab60 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
1ab70 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
1ab80 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
1ab90 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
1aba0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1abb0 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
1abc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1abd0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
1abe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1abf0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
1ac00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ac10 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
1ac20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ac30 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
1ac40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
1ac50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ac60 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
1ac70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ac80 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ac90 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1aca0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1acb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1acc0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1acd0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1ace0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1acf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ad00 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1ad10 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1ad20 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1ad30 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1ad40 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad60 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1ad70 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ad80 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1ad90 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1ada0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1adb0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1adc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1add0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1ade0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1adf0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1ae00 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
1ae10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ae20 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1ae30 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ae40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ae50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ae60 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1ae70 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1ae80 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ae90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1aea0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1aeb0 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
1aec0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1aed0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1aee0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1aef0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1af00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1af10 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1af20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1af30 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  est, SQLITE_NULL
1af40 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
1af50 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1af60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1af70 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1af80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1af90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1afa0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1afb0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1afc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1afd0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
1afe0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
1aff0 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1b000 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1b010 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1b020 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1b030 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b040 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1b050 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1b060 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1b070 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1b080 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1b090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b0a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1b0b0 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1b0c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1b0d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1b0e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b0f0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1b100 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1b110 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1b120 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1b130 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1b140 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1b150 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1b160 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b170 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1b180 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b190 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1b1a0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1b1b0 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1b1c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b1d0 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1b1e0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
1b1f0 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
1b200 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
1b210 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1b220 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1b230 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
1b240 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1b250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1b270 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
1b280 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b290 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1b2a0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
1b2b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1b2c0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1b2d0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
1b2e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1b2f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1b300 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1b310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b320 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
1b330 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
1b340 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
1b350 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1b360 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1b370 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1b380 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1b390 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1b3a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1b3b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b3c0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1b3d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b3e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1b3f0 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
1b400 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b410 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
1b420 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
1b430 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1b440 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1b450 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1b460 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1b470 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
1b480 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1b490 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1b4a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1b4b0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
1b4c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b4d0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1b4e0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1b4f0 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
1b500 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
1b510 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
1b520 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
1b530 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
1b540 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
1b550 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b560 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
1b570 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1b580 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
1b590 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
1b5a0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
1b5b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1b5c0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
1b5d0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1b5e0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1b5f0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
1b600 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
1b610 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1b620 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
1b630 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1b640 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
1b650 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
1b660 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45  xistance of VDBE
1b670 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1b680 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
1b690 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
1b6a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
1b6b0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
1b6c0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
1b6d0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
1b6e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
1b6f0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
1b700 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
1b710 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
1b720 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
1b730 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
1b740 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
1b750 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
1b760 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
1b770 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
1b780 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1b7a0 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
1b7b0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
1b7c0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
1b7d0 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
1b7e0 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
1b7f0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
1b800 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
1b810 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1b830 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
1b840 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
1b850 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
1b860 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
1b870 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
1b880 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
1b890 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
1b8a0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
1b8b0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
1b8c0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
1b8d0 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
1b8e0 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
1b8f0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
1b900 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
1b910 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
1b920 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
1b930 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1b940 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
1b950 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
1b960 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
1b970 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
1b980 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
1b990 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
1b9a0 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
1b9b0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
1b9c0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
1b9d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b9e0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
1b9f0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
1ba00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1ba10 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
1ba20 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
1ba30 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
1ba40 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
1ba50 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
1ba60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1ba70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
1ba80 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
1ba90 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1baa0 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
1bab0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
1bac0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1bad0 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
1bae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1baf0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
1bb00 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
1bb10 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1bb20 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
1bb30 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
1bb40 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
1bb50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1bb60 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1bb70 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1bb80 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1bb90 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1bba0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1bbb0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1bbc0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1bbd0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1bbe0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bbf0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1bc00 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1bc10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1bc20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
1bc30 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
1bc40 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1bc50 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
1bc60 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1bc70 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1bc80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1bc90 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1bca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1bcb0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1bcc0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
1bcd0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1bce0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1bcf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1bd00 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1bd10 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1bd20 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1bd30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bd40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1bd50 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
1bd60 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1bd70 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
1bd80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bd90 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1bda0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1bdb0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1bdc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bdd0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1bde0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1bdf0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1be00 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1be10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1be20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1be30 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1be40 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1be50 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1be60 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1be70 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
1be80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1be90 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
1bea0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
1beb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bec0 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
1bed0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bee0 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
1bef0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1bf00 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
1bf10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1bf20 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
1bf30 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1bf40 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1bf50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1bf60 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1bf70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1bf80 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1bf90 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1bfa0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1bfb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1bfc0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1bfd0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1bfe0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1bff0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1c000 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1c010 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1c020 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1c030 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c040 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1c050 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c060 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1c070 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c080 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c090 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1c0a0 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1c0b0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1c0c0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1c0d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1c0e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1c0f0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1c100 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c110 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1c120 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1c130 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1c140 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1c150 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1c160 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1c170 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
1c180 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  = (pExpr->op==TK
1c190 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54  _IS) ? TK_NE : T
1c1a0 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_EQ;.      code
1c1b0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1c1c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1c1d0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1c1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c1f0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1c200 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
1c210 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c220 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1c230 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c240 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1c250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c260 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1c270 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
1c280 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
1c290 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c2a0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1c2b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1c2c0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1c2d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1c2e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1c2f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1c300 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1c310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c320 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1c330 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
1c340 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1c350 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1c360 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c370 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1c380 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1c390 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1c3a0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1c3b0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1c3c0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1c3d0 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  0, jumpIfNull);.
1c3e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c3f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1c400 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1c410 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1c420 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
1c430 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1c440 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c450 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
1c460 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
1c470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c480 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1c490 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1c4a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1c4b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c4c0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1c4d0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
1c4e0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1c4f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1c500 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1c510 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1c520 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1c530 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c540 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1c550 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1c560 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1c570 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1c580 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1c590 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1c5a0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
1c5b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
1c5c0 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      testc
1c5d0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1c5e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c5f0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1c600 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1c620 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1c630 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1c640 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1c650 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1c660 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1c670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1c680 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
1c690 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
1c6a0 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
1c6b0 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
1c6c0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1c6d0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
1c6e0 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
1c6f0 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
1c700 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
1c710 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
1c720 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
1c730 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
1c740 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
1c750 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
1c760 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
1c770 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
1c780 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
1c790 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1c7a0 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
1c7b0 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
1c7c0 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
1c7d0 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
1c7e0 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
1c7f0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
1c800 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
1c810 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
1c820 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
1c830 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
1c840 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1c850 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
1c860 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
1c870 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
1c880 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
1c890 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
1c8a0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
1c8b0 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
1c8c0 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
1c8d0 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
1c8e0 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
1c8f0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
1c900 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
1c910 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
1c920 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
1c930 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
1c940 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
1c950 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
1c960 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
1c970 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
1c980 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
1c990 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
1c9a0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
1c9b0 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
1c9c0 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
1c9d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1c9e0 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
1c9f0 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a  *pA, Expr *pB){.
1ca00 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
1ca10 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ca20 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
1ca30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1ca40 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1ca50 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f  ty(pA, EP_TokenO
1ca60 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1ca70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  );.  assert( !Ex
1ca80 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1ca90 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (pB, EP_TokenOnl
1caa0 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1cab0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1cac0 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 78 49  operty(pA, EP_xI
1cad0 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78 70 72  sSelect) || Expr
1cae0 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20  HasProperty(pB, 
1caf0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1cb00 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
1cb10 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
1cb20 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
1cb30 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
1cb40 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
1cb50 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
1cb60 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
1cb70 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1cb80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1cb90 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
1cba0 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
1cbb0 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 2;.  if( sqli
1cbc0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1cbd0 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
1cbe0 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
1cbf0 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  2;.  if( sqlite3
1cc00 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
1cc10 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
1cc20 3e 78 2e 70 4c 69 73 74 29 20 29 20 72 65 74 75  >x.pList) ) retu
1cc30 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 2;.  if( pA->
1cc40 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
1cc50 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
1cc60 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
1cc70 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1cc80 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1cc90 28 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pA, EP_IntValue
1cca0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78  ) ){.    if( !Ex
1ccb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1ccc0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
1ccd0 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d  | pA->u.iValue!=
1cce0 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
1ccf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1cd00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1cd10 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
1cd20 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
1cd30 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 45  ken ){.    if( E
1cd40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1cd50 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  B, EP_IntValue) 
1cd60 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a  || NEVER(pB->u.z
1cd70 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75  Token==0) ) retu
1cd80 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
1cd90 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
1cda0 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
1cdb0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
1cdc0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
1cdd0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
1cde0 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  A->flags & EP_Ex
1cdf0 70 43 6f 6c 6c 61 74 65 29 21 3d 28 70 42 2d 3e  pCollate)!=(pB->
1ce00 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1ce10 6c 6c 61 74 65 29 20 29 20 72 65 74 75 72 6e 20  llate) ) return 
1ce20 31 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  1;.  if( (pA->fl
1ce30 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1ce40 61 74 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 70  ate)!=0 && pA->p
1ce50 43 6f 6c 6c 21 3d 70 42 2d 3e 70 43 6f 6c 6c 20  Coll!=pB->pColl 
1ce60 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 72 65  ) return 2;.  re
1ce70 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1ce80 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
1ce90 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
1cea0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
1ceb0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
1cec0 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
1ced0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
1cee0 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
1cef0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
1cf00 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
1cf10 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
1cf20 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
1cf30 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
1cf40 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
1cf50 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
1cf60 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
1cf70 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
1cf80 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
1cf90 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
1cfa0 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
1cfb0 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
1cfc0 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
1cfd0 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
1cfe0 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
1cff0 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
1d000 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
1d010 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
1d020 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
1d030 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
1d040 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
1d050 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d060 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
1d070 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
1d080 70 72 4c 69 73 74 20 2a 70 42 29 7b 0a 20 20 69  prList *pB){.  i
1d090 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
1d0a0 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
1d0b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
1d0c0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
1d0d0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
1d0e0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
1d0f0 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
1d100 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
1d110 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1d120 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
1d130 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
1d140 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
1d150 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
1d160 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
1d170 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
1d180 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
1d190 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
1d1a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1d1b0 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
1d1c0 20 70 45 78 70 72 42 29 20 29 20 72 65 74 75 72   pExprB) ) retur
1d1d0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
1d1e0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1d1f0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1d200 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
1d210 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
1d220 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1d230 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
1d240 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
1d250 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1d260 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
1d270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1d280 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
1d290 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
1d2a0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
1d2b0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
1d2c0 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
1d2d0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1d2e0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1d2f0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
1d300 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
1d310 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
1d320 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
1d330 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
1d340 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
1d350 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  olumnAlloc,.    
1d360 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
1d370 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
1d380 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
1d390 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
1d3a0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
1d3b0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
1d3c0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
1d3d0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
1d3e0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
1d3f0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
1d400 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
1d410 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
1d420 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
1d430 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
1d440 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
1d450 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
1d460 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1d470 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
1d480 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
1d490 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
1d4a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
1d4b0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
1d4c0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
1d4d0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49  Func,.       &pI
1d4e0 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c  nfo->nFuncAlloc,
1d4f0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
1d500 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
1d510 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
1d520 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
1d530 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
1d540 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
1d550 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
1d560 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
1d570 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
1d580 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
1d590 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1d5a0 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
1d5b0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1d5c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1d5d0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
1d5e0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
1d5f0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
1d600 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
1d610 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
1d620 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
1d630 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
1d640 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
1d650 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
1d660 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
1d670 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
1d680 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
1d690 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
1d6a0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1d6b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1d6c0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
1d6d0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1d6e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1d6f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
1d700 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1d710 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
1d720 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1d730 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
1d740 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
1d750 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
1d760 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
1d770 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
1d780 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
1d790 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
1d7a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
1d7b0 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
1d7c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
1d7d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d7e0 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
1d7f0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
1d800 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
1d810 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1d820 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1d830 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1d840 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
1d850 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1d860 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1d870 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
1d880 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
1d890 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
1d8a0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
1d8b0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
1d8c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1d8d0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
1d8e0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
1d8f0 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
1d900 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
1d910 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1d920 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
1d930 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1d940 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
1d950 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
1d960 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
1d970 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
1d980 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
1d990 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
1d9a0 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
1d9b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
1d9c0 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
1d9d0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
1d9e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d9f0 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
1da00 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
1da10 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
1da20 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
1da30 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
1da40 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
1da50 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
1da60 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
1da70 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
1da80 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
1da90 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1daa0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
1dab0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1dad0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1dae0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1daf0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1db00 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
1db10 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
1db20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
1db30 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
1db40 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
1db50 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
1db60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1db70 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
1db80 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
1db90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dba0 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
1dbb0 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
1dbc0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
1dbd0 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
1dbe0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1dbf0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
1dc00 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
1dc10 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
1dc20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
1dc30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1dc50 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1dc60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
1dc70 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
1dc80 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
1dc90 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
1dca0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
1dcb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dcc0 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1dce0 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
1dcf0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1dd20 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
1dd30 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
1dd40 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
1dd50 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1dd60 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1dd70 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
1dd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1dd90 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1dda0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
1ddd0 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
1dde0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
1ddf0 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
1de00 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
1de10 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
1de20 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1de40 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1de50 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
1de60 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1de70 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
1de80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1de90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1deb0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
1dec0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
1ded0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dee0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1def0 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
1df00 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
1df10 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
1df20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1df30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1df40 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
1df50 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
1df60 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
1df70 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
1df80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
1df90 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
1dfa0 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
1dfb0 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
1dfc0 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
1dfd0 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
1dfe0 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
1dff0 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
1e000 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
1e010 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
1e020 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
1e030 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
1e040 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e050 20 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65       ExprSetIrre
1e060 64 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a  ducible(pExpr);.
1e070 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1e080 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
1e090 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
1e0a0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1e0b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
1e0c0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e0d0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
1e0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1e0f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
1e100 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
1e110 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
1e120 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
1e130 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
1e140 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
1e150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e160 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1e170 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e180 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
1e190 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
1e1a0 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74  pNC->nDepth==0 t
1e1b0 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65  est causes aggre
1e1c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
1e1d0 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20  n subqueries.   
1e1e0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f     ** to be igno
1e1f0 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
1e200 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
1e210 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
1e220 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
1e230 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
1e240 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
1e250 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
1e260 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
1e270 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
1e280 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
1e290 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
1e2a0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
1e2b0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1e2c0 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
1e2d0 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
1e2e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
1e2f0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1e300 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1e310 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1e320 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
1e330 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29  m->pExpr, pExpr)
1e340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1e350 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e370 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
1e380 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
1e390 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
1e3a0 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
1e3b0 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
1e3c0 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
1e3d0 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
1e3e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1e3f0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
1e400 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
1e410 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
1e420 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
1e430 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
1e440 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
1e450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e460 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e470 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e480 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1e490 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
1e4a0 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
1e4b0 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
1e4c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
1e4d0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
1e4e0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
1e4f0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1e500 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
1e510 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e520 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e530 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1e550 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
1e560 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1e570 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1e5a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e5b0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1e5c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1e5d0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
1e5e0 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
1e5f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
1e600 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
1e610 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
1e620 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1e630 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
1e640 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
1e650 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
1e660 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1e670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e680 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1e690 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
1e6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1e6b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e6c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
1e6d0 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
1e6e0 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
1e6f0 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
1e700 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
1e710 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e720 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e730 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
1e740 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
1e750 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1e760 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72         ExprSetIr
1e770 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
1e780 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1e790 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
1e7a0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1e7b0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1e7c0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
1e7d0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1e7e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e7f0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1e800 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
1e810 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
1e820 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
1e830 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1e840 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1e850 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1e860 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
1e870 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d  .pNC;.  if( pNC-
1e880 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
1e890 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
1e8a0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
1e8b0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
1e8c0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e  pSelect);.    pN
1e8d0 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20  C->nDepth--;.   
1e8e0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1e8f0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1e900 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1e910 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
1e920 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
1e930 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
1e940 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
1e950 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
1e960 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
1e970 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
1e980 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
1e990 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1e9a0 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
1e9b0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
1e9c0 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
1e9d0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
1e9e0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
1e9f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1ea00 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
1ea10 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
1ea20 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
1ea30 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
1ea40 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
1ea50 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
1ea60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1ea70 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1ea80 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
1ea90 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
1eaa0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1eab0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
1eac0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
1ead0 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
1eae0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
1eaf0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1eb00 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
1eb10 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
1eb20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
1eb30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
1eb40 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
1eb50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
1eb60 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1eb70 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
1eb80 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
1eb90 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
1eba0 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
1ebb0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1ebc0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
1ebd0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
1ebe0 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
1ebf0 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
1ec00 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1ec10 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1ec20 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
1ec30 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
1ec40 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
1ec50 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1ec60 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
1ec70 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
1ec80 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
1ec90 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1eca0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1ecb0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1ecc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1ecd0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
1ece0 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
1ecf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1ed00 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1ed10 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
1ed20 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
1ed30 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
1ed40 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
1ed50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
1ed60 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
1ed70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
1ed80 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
1ed90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1eda0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1edb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
1edc0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
1edd0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1ede0 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
1edf0 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
1ee00 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
1ee10 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
1ee20 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
1ee30 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
1ee40 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
1ee50 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1ee60 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
1ee70 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
1ee80 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f  * the dallocatio
1ee90 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
1eea0 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
1eeb0 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
1eec0 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
1eed0 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
1eee0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1eef0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1ef00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ef10 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
1ef20 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
1ef30 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
1ef40 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
1ef50 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
1ef60 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
1ef70 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
1ef80 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1ef90 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1efa0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1efb0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1efc0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
1efd0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
1efe0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
1eff0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f010 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
1f020 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
1f030 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
1f040 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1f050 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
1f060 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
1f070 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
1f080 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
1f090 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
1f0a0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
1f0b0 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
1f0c0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
1f0d0 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
1f0e0 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
1f0f0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
1f100 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
1f110 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
1f120 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
1f130 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
1f140 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
1f150 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
1f160 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
1f170 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
1f180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
1f190 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1f1a0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
1f1b0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
1f1c0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
1f1d0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
1f1e0 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
1f1f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1f200 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1f210 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f220 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1f230 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69  iReg, nReg);.  i
1f240 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
1f250 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
1f260 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1f270 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
1f280 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
1f290 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a      = iReg;.  }.}.