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

Artifact c33584bcf4ee011e28ff74e4dcef02da1dc09dd6:


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 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20  se{.    ynVar x 
4280: 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d  = 0;.    u32 n =
4290: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
42a0: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  (z);.    if( z[0
42b0: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
42c0: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
42d0: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
42e0: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
42f0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
4300: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74  .      ** use it
4310: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
4320: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
4330: 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e   i64 i;.      in
4340: 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74  t bOk = 0==sqlit
4350: 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20  e3Atoi64(&z[1], 
4360: 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f  &i, n-1, SQLITE_
4370: 55 54 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78  UTF8);.      pEx
4380: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
4390: 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20  = (ynVar)i;.    
43a0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
43b0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
43c0: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
43d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
43e0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
43f0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4400: 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20  NUMBER]-1 );.   
4410: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
4420: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4430: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4440: 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20  _NUMBER] );.    
4450: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20    if( bOk==0 || 
4460: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
4470: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4480: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4490: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
44a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
44b0: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
44c0: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
44d0: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
44e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ",.            d
44f0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4500: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4510: 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20  NUMBER]);.      
4520: 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    x = 0;.      }
4530: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 70 50 61  .      if( i>pPa
4540: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
4550: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
4560: 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20  r = (int)i;.    
4570: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
4580: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
4590: 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22  s like ":aaa", "
45a0: 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e  $aaa" or "@aaa".
45b0: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
45c0: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
45d0: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
45e0: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
45f0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
4600: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
4610: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  me.      ** has 
4620: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
4630: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
4640: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
4650: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20  umber.      */. 
4660: 20 20 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20       ynVar i;.  
4670: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4680: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b  Parse->nzVar; i+
4690: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
46a0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d  pParse->azVar[i]
46b0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 61 72 73   && memcmp(pPars
46c0: 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a 2c 6e 2b  e->azVar[i],z,n+
46d0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
46e0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
46f0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
4700: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
4710: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
4720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4730: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
4740: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4750: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
4760: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
4770: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
4780: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
4790: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
47a0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
47b0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
47c0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
47d0: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
47e0: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
47f0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65     if( a==0 ) re
4800: 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20  turn;  /* Error 
4810: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
4820: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4830: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61  d */.        pPa
4840: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
4850: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
4860: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
4870: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
4880: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
4890: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
48a0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
48b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
48c0: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
48d0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
48e0: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
48f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4900: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4910: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
4920: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
4930: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
4940: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
4950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4960: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
4970: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
4980: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
4990: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
49a0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
49b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
49c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
49d0: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
49e0: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
49f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4a00: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4a10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4a20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4a30: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4a40: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4a50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4a60: 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  urn;.  /* Sanity
4a70: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
4a80: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
4a90: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
4aa0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
4ab0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
4ac0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4ad0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
4ae0: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
4af0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
4b00: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
4b10: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
4b20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4b30: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66  lete(db, p->pLef
4b40: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4b50: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4b60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
4b70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
4b80: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
4b90: 29 20 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20  ) && (p->flags2 
4ba0: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
4bb0: 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
4bc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4bd0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
4be0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45  .    }.    if( E
4bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4c00: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
4c10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4c20: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4c30: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
4c40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4c60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
4c70: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
4c80: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
4c90: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
4ca0: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
4cb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4cc0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
4cd0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
4ce0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
4cf0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
4d00: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
4d10: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
4d20: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4d30: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
4d40: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
4d50: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
4d60: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
4d70: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
4d80: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
4d90: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
4da0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
4db0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4dc0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
4dd0: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
4de0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
4df0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4e00: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
4e10: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
4e20: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
4e30: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
4e40: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
4e50: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
4e60: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
4e70: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
4e80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
4e90: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
4ea0: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
4eb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
4ec0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
4ed0: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
4ee0: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
4ef0: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
4f00: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
4f10: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
4f20: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
4f30: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
4f40: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
4f50: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
4f60: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
4f70: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
4f80: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
4f90: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
4fa0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
4fb0: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
4fc0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5020: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5030: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5040: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5050: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
5060: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5070: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5080: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5090: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
50a0: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
50b0: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
50c0: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
50d0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
50e0: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
50f0: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5100: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5110: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5120: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5130: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5140: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5150: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5160: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5170: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5180: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5190: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
51a0: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
51b0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
51c0: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
51d0: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
51e0: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
51f0: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5200: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5210: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5220: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5230: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5240: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5250: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5260: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5270: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5280: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5290: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
52a0: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
52b0: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
52c0: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
52d0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
52e0: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
52f0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5300: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5310: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5320: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5330: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5340: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5350: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5360: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5370: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5380: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5390: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
53a0: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
53b0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
53c0: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
53d0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
53e0: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
53f0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5400: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5410: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5420: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5430: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5440: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5450: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5460: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5470: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5480: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5490: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
54a0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
54b0: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
54c0: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
54d0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
54e0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
54f0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5500: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5510: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5520: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5530: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5540: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5550: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69  e allowed */.  i
5560: 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50  f( 0==(flags&EXP
5570: 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a  RDUP_REDUCE) ){.
5580: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5590: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
55a0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
55b0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
55c0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
55d0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
55e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
55f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5600: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
5610: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
5620: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5630: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d  _MallocedToken)=
5640: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
5650: 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  ( (p->flags2 & E
5660: 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d  P2_Irreducible)=
5670: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
5680: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69  >pLeft || p->pRi
5690: 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20  ght || p->pColl 
56a0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
56b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
56c0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
56d0: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
56e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
56f0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
5700: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5710: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
5720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
5730: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
5740: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
5750: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
5760: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
5770: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5780: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
5790: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
57a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
57b0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
57c0: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
57d0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
57e0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
57f0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5800: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5810: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5820: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
5830: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
5840: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
5850: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5860: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5870: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
5880: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
5890: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
58a0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
58b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
58c0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
58d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
58e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
58f0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
5900: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
5910: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
5920: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
5930: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5940: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
5950: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
5960: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
5970: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
5980: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
5990: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
59a0: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
59b0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
59c0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
59d0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
59e0: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
59f0: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
5a00: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
5a10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
5a20: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
5a30: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
5a40: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
5a50: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
5a60: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
5a70: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
5a80: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
5a90: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
5aa0: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
5ab0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
5ac0: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
5ad0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
5ae0: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
5af0: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
5b00: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
5b10: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
5b20: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
5b30: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5b40: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
5b50: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
5b60: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
5b70: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
5b80: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5b90: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
5ba0: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
5bb0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
5bc0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
5bd0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
5be0: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
5bf0: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
5c00: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
5c10: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5c20: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
5c30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5c40: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
5c50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
5c60: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
5c70: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
5c80: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
5c90: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
5ca0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
5cb0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
5cc0: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
5cd0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
5ce0: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
5cf0: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
5d00: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
5d10: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
5d20: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
5d30: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
5d40: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
5d50: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
5d60: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
5d70: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
5d80: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
5d90: 74 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a  te passed the.**
5da0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5db0: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
5dc0: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
5dd0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
5de0: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
5df0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
5e00: 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38  p, int flags, u8
5e10: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
5e20: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20  Expr *pNew = 0; 
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
5e50: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28   return */.  if(
5e60: 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   p ){.    const 
5e70: 69 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20  int isReduced = 
5e80: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
5e90: 45 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a  EDUCE);.    u8 *
5ea0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20  zAlloc;.    u32 
5eb0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
5ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42  .    assert( pzB
5ed0: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65  uffer==0 || isRe
5ee0: 64 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a  duced );..    /*
5ef0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
5f00: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
5f10: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
5f20: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a  e. */.    if( pz
5f30: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
5f40: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
5f50: 65 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  er;.      static
5f60: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
5f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5f80: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
5f90: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
5fa0: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
5fb0: 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20  (p, flags));.   
5fc0: 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45   }.    pNew = (E
5fd0: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
5fe0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
5ff0: 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77       /* Set nNew
6000: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
6010: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
6020: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
6030: 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  nted to.      **
6040: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
6050: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
6060: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
6070: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
6080: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
6090: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
60a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
60b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
60c0: 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20  nsumed.      ** 
60d0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
60e0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
60f0: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
6100: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
6110: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
6120: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
6130: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6140: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
6150: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
6160: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
6170: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20  e & 0xfff;.     
6180: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
6190: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
61a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
61b0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
61c0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
61d0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
61e0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
61f0: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
6200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6210: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
6220: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6230: 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20  isReduced ){.   
6240: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
6250: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6260: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
6270: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6280: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
6290: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
62a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
62b0: 6e 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75  nSize = exprStru
62c0: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
62d0: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
62e0: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
62f0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
6300: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
6310: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
6320: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ze);.      }..  
6330: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
6340: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
6350: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
6360: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
6370: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
6380: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6390: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
63a0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
63b0: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
63c0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
63d0: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
63e0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
63f0: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e  nOnly);.      pN
6400: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
6410: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20  ticFlag;..      
6420: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
6430: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
6440: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
6450: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
6460: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
6470: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
6480: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
6490: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
64a0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
64b0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
64c0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
64d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
64e0: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
64f0: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50  New->flags) & EP
6500: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6510: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
6520: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
6530: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
6540: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
6550: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  /.        if( Ex
6560: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6570: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
6580: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6590: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
65a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
65b0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
65c0: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
65d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
65e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
65f0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
6600: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
6610: 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63  x.pList, isReduc
6620: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ed);.        }. 
6630: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
6640: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
6650: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
6660: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  Right. */.      
6670: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
6680: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
6690: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
66a0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
66b0: 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64   zAlloc += duped
66c0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
66d0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
66e0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
66f0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
6700: 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  uced) ){.       
6710: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
6720: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6730: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
6740: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
6750: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6760: 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75  >pRight = exprDu
6770: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
6780: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
6790: 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20   &zAlloc);.     
67a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
67b0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
67c0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
67d0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
67e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
67f0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6800: 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20  flags2 = 0;.    
6810: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
6820: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
6830: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6840: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6850: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
6860: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6870: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
6880: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
68a0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
68b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
68c0: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
68d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
68e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
68f0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
6900: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
6910: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
6920: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
6930: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
6940: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
6950: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
6960: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
6970: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
6980: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
6990: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
69a0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
69b0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
69c0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
69d0: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
69e0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
69f0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
6a00: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
6a10: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
6a20: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
6a30: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
6a40: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
6a50: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
6a60: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
6a70: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
6a80: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
6a90: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
6aa0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
6ab0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
6ac0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
6ad0: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
6ae0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
6af0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
6b00: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
6b10: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
6b20: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
6b30: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
6b40: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6b50: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6b60: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6b70: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
6b80: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
6b90: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
6ba0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
6bb0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
6bc0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
6bd0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
6be0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6bf0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6c00: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
6c10: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6c20: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
6c30: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
6c40: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
6c50: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
6c60: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
6c70: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
6c80: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
6c90: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
6ca0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
6cb0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
6cc0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
6cd0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6ce0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
6cf0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
6d00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6d10: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
6d20: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
6d30: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
6d40: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
6d50: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
6d60: 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  >iECursor = 0;. 
6d70: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
6d80: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
6d90: 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e  >nExpr;.  pNew->
6da0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
6db0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
6dc0: 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  b,  p->nExpr*siz
6dd0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
6de0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
6df0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
6e00: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
6e10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6e20: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
6e30: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
6e40: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
6e50: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
6e60: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
6e70: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
6e80: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
6e90: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
6ea0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6eb0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
6ec0: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
6ed0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
6ee0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
6ef0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
6f00: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
6f10: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6f20: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
6f30: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
6f40: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
6f50: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
6f60: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
6f70: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
6f80: 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74  m->iCol = pOldIt
6f90: 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49  em->iCol;.    pI
6fa0: 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f  tem->iAlias = pO
6fb0: 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a  ldItem->iAlias;.
6fc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
6fd0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
6fe0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
6ff0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
7000: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
7010: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
7020: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
7030: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
7040: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
7050: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
7060: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
7070: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
7080: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
7090: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
70a0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
70b0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
70c0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
70d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
70e0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
70f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
7100: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
7110: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7120: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
7130: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
7140: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7150: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
7160: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
7170: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7180: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
7190: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
71a0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
71b0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
71c0: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
71d0: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
71e0: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
71f0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7200: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
7210: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
7220: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7230: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
7240: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
7250: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
7260: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
7270: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7280: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
7290: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
72a0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
72b0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
72c0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
72d0: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
72e0: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
72f0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
7300: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7310: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
7320: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
7330: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
7340: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7350: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7360: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
7370: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
7380: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7390: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
73a0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
73b0: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
73c0: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
73d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
73e0: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
73f0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
7400: 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  NewItem->isPopul
7410: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
7420: 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20  >isPopulated;.  
7430: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7440: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7450: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7460: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7470: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7480: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7490: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
74a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
74b0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
74c0: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
74d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
74e0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
74f0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7500: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7510: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7520: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7530: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7540: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7550: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7560: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7570: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7580: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7590: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
75a0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
75b0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
75c0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
75d0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
75e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
75f0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7600: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
7610: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7620: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7630: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7640: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7650: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
7660: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
7670: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7680: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7690: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
76a0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
76b0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
76c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
76d0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
76e0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
76f0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
7700: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7710: 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  w(db, p->nId*siz
7720: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
7730: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
7740: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
7750: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
7760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7770: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
7780: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
7790: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
77a0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
77b0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
77c0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
77d0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
77e0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
77f0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
7800: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7810: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7820: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
7830: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
7840: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
7850: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
7860: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
7870: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
7880: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
7890: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
78a0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66  lect *pNew;.  if
78b0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
78c0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
78d0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
78e0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
78f0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7900: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7910: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
7920: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7930: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
7940: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ags);.  pNew->pS
7950: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
7960: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
7970: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  rc, flags);.  pN
7980: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
7990: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
79a0: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
79b0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
79c0: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
79d0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
79e0: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
79f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
7a00: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
7a10: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
7a20: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  g, flags);.  pNe
7a30: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
7a40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7a50: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
7a60: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7a70: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
7a80: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
7a90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7aa0: 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66  db, p->pPrior, f
7ab0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7ac0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
7ad0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
7ae0: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
7af0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
7b00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7b10: 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66  b, p->pOffset, f
7b20: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  lags);.  pNew->i
7b30: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
7b40: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->iOffset = 0;.
7b50: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
7b60: 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   = p->selFlags &
7b70: 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72   ~SF_UsesEphemer
7b80: 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  al;.  pNew->pRig
7b90: 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e  htmost = 0;.  pN
7ba0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7bb0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
7bc0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
7bd0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
7be0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
7bf0: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
7c00: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
7c10: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
7c20: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
7c30: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
7c40: 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
7c50: 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65  rt( p==0 );.  re
7c60: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
7c70: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
7c80: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
7c90: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
7ca0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
7cb0: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
7cc0: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
7cd0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
7ce0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
7cf0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
7d00: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
7d10: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
7d20: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
7d30: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
7d40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
7d50: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
7d60: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
7d70: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
7d80: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
7d90: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
7da0: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
7db0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
7dc0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
7dd0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7de0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
7df0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7e00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
7e10: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
7e20: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
7e30: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
7e40: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
7e50: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
7e60: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7e70: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
7e80: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
7e90: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
7ea0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7eb0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
7ec0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
7ed0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7ee0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
7ef0: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
7f00: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
7f10: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
7f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
7f30: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
7f40: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
7f50: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
7f60: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
7f70: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
7f80: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
7f90: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
7fa0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
7fb0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
7fc0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
7fd0: 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70  t->a, n*sizeof(p
7fe0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
7ff0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
8000: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8010: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
8020: 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69  ->a = a;.    pLi
8030: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c  st->nAlloc = sql
8040: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
8050: 28 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61  (db, a)/sizeof(a
8060: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [0]);.  }.  asse
8070: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
8080: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
8090: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
80a0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
80b0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
80c0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
80d0: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
80e0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
80f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
8100: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
8110: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
8120: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
8130: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
8140: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
8150: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
8160: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8170: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
8180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8190: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
81a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
81b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
81c0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
81d0: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
81e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
81f0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
8200: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8210: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
8220: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
8230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
8240: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
8250: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
8260: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
8270: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
8280: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
8290: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
82a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
82b0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
82c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
82d0: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
82e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
82f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8300: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8310: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8320: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
8330: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
8340: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
8350: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
8360: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
8370: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
8380: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
8390: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
83a0: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
83b0: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
83c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
83d0: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
83e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
83f0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
8400: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
8410: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8420: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
8430: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
8440: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
8450: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
8460: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
8470: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
8480: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
8490: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
84a0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
84b0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
84c0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
84d0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
84e0: 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
84f0: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
8500: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
8510: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
8520: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
8530: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
8540: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8550: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
8560: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
8570: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8580: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
8590: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
85a0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
85b0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
85c0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
85d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
85e0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
85f0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
8600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
8610: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
8620: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8630: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
8640: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8650: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8660: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8670: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8680: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
8690: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
86a0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78  he span. */.  Ex
86b0: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20  prSpan *pSpan   
86c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61        /* The spa
86d0: 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  n to be added */
86e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
86f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8700: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
8710: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
8720: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
8730: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
8740: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8750: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
8760: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
8770: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
8780: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8790: 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r>0 );.    asser
87a0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
87b0: 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45  led || pItem->pE
87c0: 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70  xpr==pSpan->pExp
87d0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
87e0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
87f0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
8800: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
8810: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8820: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
8830: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
8860: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
8870: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
8880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
8890: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
88a0: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
88b0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
88c0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
88d0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
88e0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
88f0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
8900: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
8910: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
8920: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
8930: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
8940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
8950: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
8960: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
8970: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8980: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  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 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
89c0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
89d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
89e0: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
89f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
8a00: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
8a10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8a20: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
8a30: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
8a40: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
8a50: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
8a60: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
8a70: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
8a80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8a90: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
8aa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8ab0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
8ac0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8ad0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
8ae0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
8af0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
8b00: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
8b10: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
8b20: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
8b30: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
8b40: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
8b50: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
8b60: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
8b70: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
8b80: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
8b90: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
8ba0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8bb0: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
8bc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8bd0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
8be0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
8bf0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
8c00: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
8c10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8c20: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
8c30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8c40: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
8c50: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
8c60: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
8c70: 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72  llbacks.  Walker
8c80: 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74  .u.pi is a point
8c90: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65  er.** to an inte
8ca0: 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ger.  These rout
8cb0: 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e  ines are checkin
8cc0: 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
8cd0: 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20  to see.** if it 
8ce0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20  is a constant.  
8cf0: 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69  Set *Walker.u.pi
8d00: 20 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70   to 0 if the exp
8d10: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f  ression is.** no
8d20: 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  t constant..**.*
8d30: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
8d40: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
8d50: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
8d60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
8d70: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
8d80: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
8d90: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
8da0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
8db0: 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71  Join().**     sq
8dc0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
8dd0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a  antOrFunction().
8de0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
8df0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
8e00: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
8e10: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
8e20: 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c  ){..  /* If pWal
8e30: 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68  ker->u.i is 3 th
8e40: 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74  en any term of t
8e50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
8e60: 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20  at comes from.  
8e70: 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
8e80: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
8e90: 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65  join disqualifie
8ea0: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
8eb0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67  .  ** from being
8ec0: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73   considered cons
8ed0: 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tant. */.  if( p
8ee0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26  Walker->u.i==3 &
8ef0: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
8f00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
8f10: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
8f20: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
8f30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
8f40: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
8f50: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
8f60: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
8f70: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
8f80: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
8f90: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
8fa0: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
8fb0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c  .    ** and pWal
8fc0: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20  ker->u.i==2 */. 
8fd0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
8fe0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
8ff0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29  Walker->u.i==2 )
9000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
9010: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
9020: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
9030: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
9040: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
9050: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
9060: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
9070: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
9080: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9090: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
90a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
90b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
90c0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
90d0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
90e0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
90f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9100: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9110: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9120: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
9130: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
9140: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9150: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9160: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9170: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
9180: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
9190: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
91a0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
91b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
91c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
91d0: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
91e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
91f0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
9200: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9210: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
9220: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
9230: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
9240: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
9250: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
9260: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
9270: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
9280: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
9290: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
92a0: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
92b0: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
92c0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
92d0: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
92e0: 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69  r w;.  w.u.i = i
92f0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
9300: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
9310: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
9320: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
9330: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
9340: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
9350: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
9360: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
9370: 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w.u.i;.}../*.** 
9380: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
9390: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
93a0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
93b0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
93c0: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
93d0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
93e0: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
93f0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
9400: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
9410: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
9420: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
9430: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
9440: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
9450: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
9460: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
9470: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
9480: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
9490: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
94a0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
94b0: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
94c0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
94d0: 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 1);.}../*.
94e0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
94f0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
9500: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
9510: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
9520: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
9530: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
9540: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
9550: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
9560: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
9570: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
9580: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
9590: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
95a0: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
95b0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
95c0: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
95d0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
95e0: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
95f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
9600: 49 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d  IsConst(p, 3);.}
9610: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
9620: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9630: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
9640: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9650: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
9660: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
9670: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
9680: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
9690: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
96a0: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
96b0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
96c0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
96d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
96e0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
96f0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
9700: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
9710: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
9720: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
9730: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
9740: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
9750: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
9760: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9770: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
9780: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
9790: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
97a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
97b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
97c0: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
97d0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
97e0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
97f0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
9800: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
9810: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
9820: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
9830: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
9840: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
9850: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
9860: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
9870: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
9880: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
9890: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
98a0: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
98b0: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
98c0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
98d0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
98e0: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
98f0: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
9900: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  int rc = 0;..  /
9910: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
9920: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
9930: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
9940: 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
9950: 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
9960: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
9970: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
9980: 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
9990: 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
99a0: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
99b0: 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
99c0: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
99d0: 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
99e0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
99f0: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
9a00: 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
9a10: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
9a20: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
9a30: 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
9a40: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
9a50: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
9a60: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
9a70: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
9a80: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
9a90: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9aa0: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
9ab0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
9ac0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9ad0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
9ae0: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
9af0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9b00: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
9b10: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
9b20: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
9b30: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
9b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9b50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9b60: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
9b70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9b90: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
9ba0: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
9bb0: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
9bc0: 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
9bd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9be0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
9bf0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
9c00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
9c10: 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
9c20: 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
9c30: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
9c40: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
9c50: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
9c60: 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
9c70: 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
9c80: 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
9c90: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
9ca0: 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
9cb0: 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
9cc0: 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
9cd0: 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
9ce0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
9cf0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
9d00: 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
9d10: 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
9d20: 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
9d30: 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
9d40: 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
9d50: 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
9d60: 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
9d70: 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
9d80: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
9d90: 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
9da0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
9db0: 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
9dc0: 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
9dd0: 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
9de0: 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
9df0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
9e00: 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
9e10: 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
9e20: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
9e30: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
9e40: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
9e50: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
9e60: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
9e70: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
9e80: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
9e90: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
9ea0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9eb0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
9ec0: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
9ed0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
9ee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
9ef0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
9f00: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
9f10: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9f20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
9f30: 72 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e 75 6c  rate an OP_IsNul
9f40: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  l instruction th
9f50: 61 74 20 74 65 73 74 73 20 72 65 67 69 73 74 65  at tests registe
9f60: 72 20 69 52 65 67 20 61 6e 64 20 6a 75 6d 70 73  r iReg and jumps
9f70: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  .** to location 
9f80: 69 44 65 73 74 20 69 66 20 74 68 65 20 76 61 6c  iDest if the val
9f90: 75 65 20 69 6e 20 69 52 65 67 20 69 73 20 4e 55  ue in iReg is NU
9fa0: 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  LL.  The value i
9fb0: 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61 73 20 63  n iReg .** was c
9fc0: 6f 6d 70 75 74 65 64 20 62 79 20 70 45 78 70 72  omputed by pExpr
9fd0: 2e 20 20 49 66 20 77 65 20 63 61 6e 20 6c 6f 6f  .  If we can loo
9fe0: 6b 20 61 74 20 70 45 78 70 72 20 61 74 20 63 6f  k at pExpr at co
9ff0: 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 0a 2a  mpile-time and.*
a000: 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61 74  * determine that
a010: 20 69 74 20 63 61 6e 20 6e 65 76 65 72 20 67 65   it can never ge
a020: 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c 20 74  nerate a NULL, t
a030: 68 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e 75 6c  hen the OP_IsNul
a040: 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  l operation.** c
a050: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a 2a  an be omitted..*
a060: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
a070: 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
a080: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
a090: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
a0a0: 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
a0b0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  uction */.  cons
a0c0: 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  t Expr *pExpr,  
a0d0: 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65  /* Only generate
a0e0: 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20 74 68   OP_IsNull if th
a0f0: 69 73 20 65 78 70 72 20 63 61 6e 20 62 65 20 4e  is expr can be N
a100: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ULL */.  int iRe
a110: 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
a120: 54 65 73 74 20 74 68 65 20 76 61 6c 75 65 20 69  Test the value i
a130: 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
a140: 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  for NULL */.  in
a150: 74 20 69 44 65 73 74 20 20 20 20 20 20 20 20 20  t iDest         
a160: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
a170: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e  f the value is n
a180: 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ull */.){.  if( 
a190: 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
a1a0: 4e 75 6c 6c 28 70 45 78 70 72 29 20 29 7b 0a 20  Null(pExpr) ){. 
a1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
a1d0: 6c 2c 20 69 52 65 67 2c 20 69 44 65 73 74 29 3b  l, iReg, iDest);
a1e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
a1f0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
a200: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
a210: 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  n is a constant 
a220: 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a  which would be.*
a230: 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f  * unchanged by O
a240: 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20  P_Affinity with 
a250: 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76  the affinity giv
a260: 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  en in the second
a270: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
a280: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a290: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
a2a0: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f  rmine if the OP_
a2b0: 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69  Affinity operati
a2c0: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
a2d0: 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64  tted.  When in d
a2e0: 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53  oubt return FALS
a2f0: 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  E.  A false nega
a300: 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c  tive.** is harml
a310: 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f  ess.  A false po
a320: 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c  sitive, however,
a330: 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74   can result in t
a340: 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77  he wrong.** answ
a350: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
a360: 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
a370: 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73  inityChange(cons
a380: 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20  t Expr *p, char 
a390: 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20  aff){.  u8 op;. 
a3a0: 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45   if( aff==SQLITE
a3b0: 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75  _AFF_NONE ) retu
a3c0: 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 1;.  while( p
a3d0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
a3e0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
a3f0: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
a400: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
a410: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
a420: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
a430: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
a440: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
a450: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
a460: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
a470: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
a480: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
a490: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
a4a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a4b0: 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
a4c0: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
a4d0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c  LITE_AFF_REAL ||
a4e0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a4f0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
a500: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
a510: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  NG: {.      retu
a520: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
a530: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20  FF_TEXT;.    }. 
a540: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
a550: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
a560: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
a570: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
a580: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a590: 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a  iTable>=0 );  /*
a5a0: 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72   p cannot be par
a5b0: 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e  t of a CHECK con
a5c0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
a5d0: 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75   return p->iColu
a5e0: 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26  mn<0.          &
a5f0: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
a600: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
a610: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
a620: 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  MERIC);.    }.  
a630: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
a640: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a650: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a660: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
a670: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
a680: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
a690: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
a6a0: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
a6b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a6c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
a6d0: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
a6e0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
a6f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
a700: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
a710: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
a720: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
a730: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
a740: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a750: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
a760: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
a770: 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
a780: 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  o the IN operato
a790: 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  r optimization o
a7a0: 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20  n a.** query of 
a7b0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
a7c0: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
a7d0: 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65  T ...).**.** Whe
a7e0: 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  re the SELECT...
a7f0: 20 63 6c 61 75 73 65 20 69 73 20 61 73 20 73 70   clause is as sp
a800: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 70  ecified by the p
a810: 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
a820: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  .** routine..**.
a830: 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62  ** The Select ob
a840: 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20 68  ject passed in h
a850: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
a860: 70 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64  preprocessed and
a870: 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61   no.** errors ha
a880: 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a  ve been found..*
a890: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
a8a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
a8b0: 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64  tatic int isCand
a8c0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65  idateForInOpt(Se
a8d0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
a8e0: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
a8f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
a900: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
a910: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
a920: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
a930: 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d         /* right-
a940: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20  hand side of IN 
a950: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  is SELECT */.  i
a960: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
a970: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
a980: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
a990: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
a9a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
a9b0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
a9c0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
a9d0: 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
a9e0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
a9f0: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
aa00: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
aa10: 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
aa20: 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
aa30: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
aa40: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
aa50: 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
aa60: 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
aa70: 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
aa80: 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
aa90: 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
aaa0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
aab0: 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
aac0: 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
aad0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
aae0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
aaf0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
ab00: 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab20: 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
ab30: 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  use */.  assert(
ab40: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
ab50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab60: 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e  /* No LIMIT mean
ab70: 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20  s no OFFSET */. 
ab80: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
ab90: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
aba0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
abb0: 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
abc0: 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  /.  pSrc = p->pS
abd0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
abe0: 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc!=0 );.  if( p
abf0: 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
ac00: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
ac10: 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d    /* Single term
ac20: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
ac30: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  */.  if( pSrc->a
ac40: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
ac50: 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
ac60: 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62  ROM is not a sub
ac70: 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f  query or view */
ac80: 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
ac90: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28  a[0].pTab;.  if(
aca0: 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20   NEVER(pTab==0) 
acb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
acc0: 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
acd0: 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
ace0: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
acf0: 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
ad00: 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
ad10: 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
ad20: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
ad30: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
ad40: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
ad50: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
ad60: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
ad70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
ad80: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
ad90: 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e     /* One column
ada0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
adb0: 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69  et */.  if( pELi
adc0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
add0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
ade0: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
adf0: 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ult is a column 
ae00: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
ae10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ae20: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
ae30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
ae40: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
ae50: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
ae60: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
ae70: 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
ae80: 2a 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20 74  ** It's job is t
ae90: 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
aea0: 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
aeb0: 75 72 65 20 74 68 61 74 20 6d 61 79 20 62 65 20  ure that may be 
aec0: 75 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20 74  used.** either t
aed0: 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65  o test for membe
aee0: 72 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e 2e  rship of the (..
aef0: 2e 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  .) set or to ite
af00: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
af10: 69 74 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69  its members, ski
af20: 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
af30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
af40: 78 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  x of the cursor 
af50: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
af60: 74 72 65 65 20 28 64 61 74 61 62 61 73 65 20 74  tree (database t
af70: 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69  able, database i
af80: 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65  ndex .** or ephe
af90: 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73  rmal table) is s
afa0: 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61  tored in pX->iTa
afb0: 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ble before this 
afc0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
afd0: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  ..** The returne
afe0: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
aff0: 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
b000: 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
b010: 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
b020: 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
b030: 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72  _ROWID - The cur
b040: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
b050: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
b060: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
b070: 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75  X_INDEX - The cu
b080: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
b090: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  on a database in
b0a0: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
b0b0: 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63  EX_EPH -   The c
b0c0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
b0d0: 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
b0e0: 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
b110: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  remal table..**.
b120: 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
b130: 2d 74 72 65 65 20 6d 61 79 20 6f 6e 6c 79 20 62  -tree may only b
b140: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45  e used if the SE
b150: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73  LECT is of the s
b160: 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a  imple.** form:.*
b170: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
b180: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
b190: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
b1a0: 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61  he prNotFound pa
b1b0: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
b1c0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  en the b-tree wi
b1d0: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
b1e0: 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
b1f0: 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
b200: 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64  , skipping any d
b210: 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68  uplicates. In th
b220: 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70  is case an.** ep
b230: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
b240: 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  st be used unles
b250: 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c  s the selected <
b260: 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61  column> is guara
b270: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
b280: 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62  nique - either b
b290: 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20  ecause it is an 
b2a0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
b2b0: 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73  KEY or it.** has
b2c0: 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72   a UNIQUE constr
b2d0: 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69  aint or UNIQUE i
b2e0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
b2f0: 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61  he prNotFound pa
b300: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
b310: 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  , then the b-tre
b320: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
b330: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
b340: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
b350: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
b360: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
b370: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
b380: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
b390: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
b3a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
b3b0: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
b3c0: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
b3d0: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
b3e0: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
b3f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
b400: 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
b410: 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
b420: 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
b430: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
b440: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77  ** needs to know
b450: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b460: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  the structure co
b470: 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55  ntains an SQL NU
b480: 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20  LL .** value in 
b490: 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74  order to correct
b4a0: 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ly evaluate expr
b4b0: 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20  essions like "X 
b4c0: 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49  IN (Y, Z)"..** I
b4d0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
b4e0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
b4f0: 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
b500: 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
b510: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
b520: 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
b530: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
b540: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
b550: 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
b560: 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49  o *prNotFound. I
b570: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
b580: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
b590: 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
b5a0: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
b5b0: 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69  en *prNotFound i
b5c0: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
b5d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
b5e0: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
b5f0: 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
b600: 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
b610: 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a  rNotFound, then.
b620: 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76  ** its initial v
b630: 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49  alue is NULL.  I
b640: 66 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73  f the (...) does
b650: 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73   not remain cons
b660: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tant.** for the 
b670: 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  duration of the 
b680: 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20  query (i.e. the 
b690: 53 45 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68  SELECT within th
b6a0: 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20  e (...).** is a 
b6b0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
b6c0: 65 72 79 29 20 74 68 65 6e 20 74 68 65 20 76 61  ery) then the va
b6d0: 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  lue of the alloc
b6e0: 61 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73  ated register is
b6f0: 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c  .** reset to NUL
b700: 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20  L each time the 
b710: 73 75 62 71 75 65 72 79 20 69 73 20 72 65 72 75  subquery is reru
b720: 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  n. This allows t
b730: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
b740: 75 73 65 20 76 64 62 65 20 63 6f 64 65 20 65 71  use vdbe code eq
b750: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
b760: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
b770: 20 20 20 69 66 28 20 72 65 67 69 73 74 65 72 3d     if( register=
b780: 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20  =NULL ){.**     
b790: 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74  has_null = <test
b7a0: 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75   if data structu
b7b0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c  re contains null
b7c0: 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65  >.**     registe
b7d0: 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  r = 1.**   }.**.
b7e0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ** in order to a
b7f0: 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65  void running the
b800: 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73   <test if data s
b810: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
b820: 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20  s null>.** test 
b830: 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20  more often than 
b840: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  is necessary..*/
b850: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b860: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
b870: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
b880: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
b890: 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e  se, Expr *pX, in
b8a0: 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a  t *prNotFound){.
b8b0: 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
b8e0: 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
b8f0: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
b900: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
b910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b920: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
b930: 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
b940: 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
b950: 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
b960: 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
b970: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
b980: 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
b990: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
b9a0: 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f  nique = (prNotFo
b9b0: 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72  und==0);   /* Tr
b9c0: 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
b9d0: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 0a 20 20 61  e unique */..  a
b9e0: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
b9f0: 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  K_IN );..  /* Ch
ba00: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
ba10: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
ba20: 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
ba30: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
ba40: 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
ba50: 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
ba60: 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
ba70: 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
ba80: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20  hemeral table.. 
ba90: 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48   */.  p = (ExprH
baa0: 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
bab0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70  P_xIsSelect) ? p
bac0: 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  X->x.pSelect : 0
bad0: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
bae0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
baf0: 20 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46   && isCandidateF
bb00: 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20  orInOpt(p) ){.  
bb10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bb20: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
bb30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
bb40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
bb50: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  */.    Expr *pEx
bb60: 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
bb70: 61 5b 30 5d 2e 70 45 78 70 72 3b 20 20 20 2f 2a  a[0].pExpr;   /*
bb80: 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c   Expression <col
bb90: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn> */.    int 
bba0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
bbb0: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
bbc0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
bbd0: 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  olumn <column> *
bbe0: 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  /.    Vdbe *v = 
bbf0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
bc00: 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
bc10: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
bc20: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
bc30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
bc40: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
bc50: 54 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 61 62  Tab;      /* Tab
bc60: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
bc70: 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
bca0: 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
bcb0: 61 62 20 2a 2f 0a 20 20 20 0a 20 20 20 20 2f 2a  ab */.   .    /*
bcc0: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69   Code an OP_Veri
bcd0: 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f  fyCookie and OP_
bce0: 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
bcf0: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
bd00: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
bd10: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
bd20: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
bd30: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
bd40: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
bd50: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
bd60: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
bd70: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
bd80: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
bd90: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ame);..    /* Th
bda0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
bdb0: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
bdc0: 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62  two places. In b
bdd0: 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64  oth cases the vd
bde0: 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c  be.    ** has al
bdf0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
be00: 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20  ated. So assume 
be10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
be20: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a   is always.    *
be30: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72  * successful her
be40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
be50: 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28  sert(v);.    if(
be60: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
be70: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
be80: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
be90: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20    int iAddr;..  
bea0: 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69      iAddr = sqli
beb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bec0: 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20   OP_If, iMem);. 
bed0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bee0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bef0: 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a  eger, 1, iMem);.
bf00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
bf10: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
bf20: 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
bf30: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
bf40: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
bf50: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
bf60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
bf70: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
bf80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bf90: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
bfc0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
bfd0: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ..      /* The c
bfe0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
bff0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
c000: 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
c010: 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20  index is to.    
c020: 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20    ** be used in 
c030: 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d  place of a temp-
c040: 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
c050: 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64  e ordered accord
c060: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ing.      ** to 
c070: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
c080: 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20  equence.  */.   
c090: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
c0a0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
c0b0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
c0c0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
c0d0: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
c0e0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
c0f0: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
c100: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
c110: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
c120: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
c130: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
c140: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
c150: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
c160: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
c170: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
c180: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
c190: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
c1a0: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  /.      char aff
c1b0: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
c1c0: 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20  inity(pX);.     
c1d0: 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
c1e0: 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = (pTab->aCol[i
c1f0: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61  Col].affinity==a
c200: 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f  ff||aff==SQLITE_
c210: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20  AFF_NONE);..    
c220: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
c230: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
c240: 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66   eType==0 && aff
c250: 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70  inity_ok; pIdx=p
c260: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
c270: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e       if( (pIdx->
c280: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
c290: 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  l).         && s
c2a0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c2b0: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70  q(db, ENC(db), p
c2c0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20  Idx->azColl[0], 
c2d0: 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20  0)==pReq.       
c2e0: 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69    && (!mustBeUni
c2f0: 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43  que || (pIdx->nC
c300: 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78  olumn==1 && pIdx
c310: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
c320: 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ne)).        ){.
c330: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d            int iM
c340: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
c350: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Mem;.          i
c360: 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20  nt iAddr;.      
c370: 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a      char *pKey;.
c380: 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65    .          pKe
c390: 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  y = (char *)sqli
c3a0: 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
c3b0: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
c3c0: 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20 3d           iAddr =
c3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3e0: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65  p1(v, OP_If, iMe
c3f0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  m);.          sq
c400: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c410: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
c420: 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20  , iMem);.  .    
c430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c440: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
c450: 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
c460: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  dx->tnum, iDb,. 
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
c490: 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  ey,P4_KEYINFO_HA
c4a0: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20  NDOFF);.        
c4b0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c4c0: 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  , "%s", pIdx->zN
c4d0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
c4e0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
c4f0: 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20  X_INDEX;..      
c500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c510: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
c520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
c530: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21   prNotFound && !
c540: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c550: 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  .notNull ){.    
c560: 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f          *prNotFo
c570: 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  und = ++pParse->
c580: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
c590: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
c5a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
c5b0: 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
c5c0: 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
c5d0: 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74  t found an exist
c5e0: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
c5f0: 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
c600: 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
c610: 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
c620: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
c630: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
c640: 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
c650: 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65     */.    double
c660: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
c670: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
c680: 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
c690: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
c6a0: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
c6b0: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
c6c0: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b  f( prNotFound ){
c6d0: 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75  .      *prNotFou
c6e0: 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  nd = rMayHaveNul
c6f0: 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
c700: 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  em;.    }else{. 
c710: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c720: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
c730: 70 3e 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20  p>(double)1 );. 
c740: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
c750: 65 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c  eryLoop = (doubl
c760: 65 29 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e)1;.      if( p
c770: 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
c780: 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 41  n<0 && !ExprHasA
c790: 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  nyProperty(pX, E
c7a0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
c7b0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
c7c0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
c7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c7e0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
c7f0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
c800: 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  X, rMayHaveNull,
c810: 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
c820: 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61  _ROWID);.    pPa
c830: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
c840: 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
c850: 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
c860: 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
c870: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
c880: 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
c890: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c8a0: 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
c8b0: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
c8c0: 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
c8d0: 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
c8e0: 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
c8f0: 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
c900: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
c910: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
c920: 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
c930: 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
c940: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
c950: 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
c960: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
c970: 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
c980: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
c990: 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
c9a0: 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
c9b0: 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
c9c0: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
c9d0: 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
c9e0: 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
c9f0: 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
ca00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
ca10: 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
ca20: 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
ca30: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
ca40: 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
ca50: 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
ca60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
ca70: 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
ca80: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
ca90: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
caa0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
cab0: 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
cac0: 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
cad0: 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
cae0: 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
caf0: 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
cb00: 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
cb10: 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
cb20: 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
cb30: 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
cb40: 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
cb50: 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
cb60: 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
cb70: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
cb80: 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
cb90: 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
cba0: 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
cbb0: 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
cbc0: 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
cbd0: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
cbe0: 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
cbf0: 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
cc00: 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
cc10: 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
cc20: 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
cc30: 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
cc40: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65  Furthermore, the
cc50: 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48 45 52   IN is in a WHER
cc60: 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 61  E clause and tha
cc70: 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61 6e 74  t we really want
cc80: 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65 20 6f  .** to iterate o
cc90: 76 65 72 20 74 68 65 20 52 48 53 20 6f 66 20 74  ver the RHS of t
cca0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
ccb0: 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69 63 6b  n order to quick
ccc0: 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c  ly locate.** all
ccd0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c   corresponding L
cce0: 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c  HS elements.  Al
ccf0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
cd00: 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
cd10: 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  e.** the registe
cd20: 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
cd30: 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e  aveNull to NULL.
cd40: 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
cd50: 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20  es will take.** 
cd60: 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
cd70: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 76   this register v
cd80: 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
cd90: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
cda0: 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
cdb0: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
cdc0: 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  is zero, that me
cdd0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
cde0: 71 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 75  query is being u
cdf0: 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65  sed.** for membe
ce00: 72 73 68 69 70 20 74 65 73 74 69 6e 67 20 6f 6e  rship testing on
ce10: 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ly.  There is no
ce20: 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   need to initial
ce30: 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73  ize any.** regis
ce40: 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61 74 65  ters to indicate
ce50: 20 74 68 65 20 70 72 65 73 65 6e 73 65 20 6f 72   the presense or
ce60: 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c   absence of NULL
ce70: 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  s on the RHS..**
ce80: 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
ce90: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
cea0: 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
ceb0: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
cec0: 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
ced0: 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61  t.  For IN opera
cee0: 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
cef0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
cf00: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
cf10: 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  0..*/.#ifndef SQ
cf20: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
cf30: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
cf40: 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
cf50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
cf60: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
cf70: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
cf80: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
cf90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
cfa0: 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
cfb0: 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
cfc0: 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
cfd0: 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ll,       /* Reg
cfe0: 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
cff0: 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
d000: 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
d010: 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
d020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
d030: 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
d040: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
d050: 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
d060: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20   testAddr = 0;  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
d090: 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
d0a0: 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d0d0: 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
d0e0: 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
d0f0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
d100: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d110: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
d120: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
d130: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
d140: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
d150: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
d160: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
d170: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
d180: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
d190: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
d1a0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
d1b0: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
d1c0: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
d1d0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
d1e0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
d1f0: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
d200: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
d210: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
d220: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
d230: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
d240: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
d250: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
d260: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
d270: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
d280: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
d290: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
d2a0: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
d2b0: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
d2c0: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
d2d0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
d2e0: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
d2f0: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
d300: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
d310: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
d320: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
d330: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
d340: 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
d350: 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70     int mem = ++p
d360: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
d370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d380: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d  p1(v, OP_If, mem
d390: 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20  );.    testAddr 
d3a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d3b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
d3c0: 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20  r, 1, mem);.    
d3d0: 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72  assert( testAddr
d3e0: 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  >0 || pParse->db
d3f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d400: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
d410: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
d420: 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  IN.  if( pParse-
d430: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
d440: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
d450: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
d460: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
d470: 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
d480: 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
d490: 74 65 73 74 41 64 64 72 3f 22 22 3a 22 43 4f 52  testAddr?"":"COR
d4a0: 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20  RELATED ",.     
d4b0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
d4c0: 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c  _IN?"LIST":"SCAL
d4d0: 41 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  AR", pParse->iNe
d4e0: 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29  xtSelectId.    )
d4f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d500: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
d510: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
d520: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
d530: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
d540: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
d550: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
d560: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d570: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
d580: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
d590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
d5a0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
d5b0: 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
d5c0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49      KeyInfo keyI
d5d0: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
d5e0: 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 74  /* Keyinfo for t
d5f0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
d600: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
d610: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
d620: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
d630: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
d640: 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
d650: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
d660: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
d670: 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
d680: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d690: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  rator */..      
d6a0: 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
d6b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d6c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d6d0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61   OP_Null, 0, rMa
d6e0: 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
d6f0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e    }..      affin
d700: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
d710: 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
d720: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
d730: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
d740: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
d750: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
d760: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
d770: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
d780: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
d790: 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70  same way.  An ep
d7a0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  hemeral table is
d7b0: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
d7c0: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
d7d0: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
d7e0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
d7f0: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
d800: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
d810: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
d820: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
d830: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
d840: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
d850: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
d860: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
d870: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d880: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
d890: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
d8a0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
d8b0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
d8c0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
d8d0: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
d8e0: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
d8f0: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
d900: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
d910: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
d920: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
d930: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
d940: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
d950: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
d960: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
d970: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
d980: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
d990: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
d9a0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
d9b0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
d9c0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
d9d0: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
d9e0: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
d9f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
da00: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
da10: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
da20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
da30: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
da40: 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e  hemeral, pExpr->
da50: 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64  iTable, !isRowid
da60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  );.      if( rMa
da70: 79 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20 73  yHaveNull==0 ) s
da80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
da90: 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
daa0: 44 45 52 45 44 29 3b 0a 20 20 20 20 20 20 6d 65  DERED);.      me
dab0: 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30  mset(&keyInfo, 0
dac0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f  , sizeof(keyInfo
dad0: 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66  ));.      keyInf
dae0: 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20  o.nField = 1;.. 
daf0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
db00: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
db10: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
db20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
db30: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
db40: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
db50: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
db60: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
db70: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
db80: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
db90: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
dba0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
dbb0: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
dbc0: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
dbd0: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
dbe0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
dbf0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
dc00: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
dc10: 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
dc20: 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
dc30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
dc40: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
dc50: 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
dc60: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
dc70: 20 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69       dest.affini
dc80: 74 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74  ty = (u8)affinit
dc90: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
dca0: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
dcb0: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
dcc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
dcd0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
dce0: 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74  .pSelect->iLimit
dcf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
dd00: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
dd10: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
dd20: 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29  .pSelect, &dest)
dd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
dd40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
dd50: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
dd60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
dd70: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
dd80: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
dd90: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 4c  pEList!=0 && pEL
dda0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b  ist->nExpr>0) ){
ddb0: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
ddc0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
ddd0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
dde0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
ddf0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
de00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
de10: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
de20: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
de30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
de40: 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
de50: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
de60: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
de70: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
de80: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
de90: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
dea0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
deb0: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
dec0: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
ded0: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
dee0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
def0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
df00: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
df10: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
df20: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
df30: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
df40: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
df50: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
df60: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
df70: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
df80: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
df90: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
dfa0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dfb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
dfc0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
dfd0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
dfe0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
dff0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e000: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
e010: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
e020: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
e030: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
e040: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
e050: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
e060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e070: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
e080: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
e090: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
e0a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
e0b0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
e0c0: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
e0d0: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
e0e0: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
e0f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
e100: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
e110: 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
e120: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
e130: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
e140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e150: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
e160: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66  , r2);.        f
e170: 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
e180: 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
e190: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
e1a0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
e1b0: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
e1c0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
e1d0: 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49       int iValToI
e1e0: 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ns;..          /
e1f0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e200: 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
e210: 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
e220: 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
e230: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
e240: 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
e250: 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
e260: 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
e270: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
e280: 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
e290: 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
e2a0: 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
e2b0: 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
e2c0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
e2d0: 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
e2e0: 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
e2f0: 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
e300: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
e310: 74 65 73 74 41 64 64 72 20 26 26 20 21 73 71 6c  testAddr && !sql
e320: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e330: 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
e340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e350: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
e360: 2c 20 74 65 73 74 41 64 64 72 2d 31 2c 20 32 29  , testAddr-1, 2)
e370: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
e380: 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  stAddr = 0;.    
e390: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e3a0: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
e3b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
e3c0: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
e3d0: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
e3e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e3f0: 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69   isRowid && sqli
e400: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
e410: 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73  (pE2, &iValToIns
e420: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
e430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e440: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
e450: 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
e460: 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
e470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
e480: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e490: 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
e4a0: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
e4b0: 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
e4c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
e4d0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
e4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e4f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
e500: 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e530: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e540: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
e550: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e560: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e570: 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
e580: 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
e590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
e5a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e5c0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
e5d0: 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
e5e0: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e600: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
e610: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
e620: 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
e630: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e640: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e650: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
e660: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
e670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e680: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e690: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        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 31 29 3b  Reg(pParse, r1);
e6c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e6d0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
e6e0: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
e6f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69    }.      if( !i
e700: 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
e710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e720: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
e730: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
e740: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
e750: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e760: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
e770: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
e780: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
e790: 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
e7a0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
e7b0: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
e7c0: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
e7d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
e7e0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
e7f0: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
e800: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
e810: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
e820: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
e830: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
e840: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
e850: 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  mn.  If this is 
e860: 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
e870: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  .      ** an int
e880: 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
e890: 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
e8a0: 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ) into a memory 
e8b0: 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e  cell.      ** an
e8c0: 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65  d record that me
e8d0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
e8e0: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
e8f0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
e900: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
e920: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
e930: 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
e940: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
e950: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
e960: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
e970: 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
e980: 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  Ct result */..  
e990: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e9a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
e9b0: 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
e9c0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e9d0: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
e9e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e9f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
ea00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
ea10: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20  K_SELECT );..   
ea20: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
ea30: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
ea40: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
ea50: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  );.      pSel = 
ea60: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
ea70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
ea80: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
ea90: 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65  est, 0, ++pParse
eaa0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69  ->nMem);.      i
eab0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
eac0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
ead0: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
eae0: 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
eaf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eb00: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
eb10: 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20  , dest.iParm);. 
eb20: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
eb30: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
eb40: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
eb50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
eb60: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
eb70: 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
eb80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
eb90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
eba0: 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
ebb0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iParm);.        
ebc0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ebd0: 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
ebe0: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
ebf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ec00: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
ec10: 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
ec20: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
ec30: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
ec40: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
ec50: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
ec90: 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
eca0: 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
ecb0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ecc0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ecd0: 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
ece0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
ecf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ed00: 72 52 65 67 20 3d 20 64 65 73 74 2e 69 50 61 72  rReg = dest.iPar
ed10: 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  m;.      ExprSet
ed20: 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70  Irreducible(pExp
ed30: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
ed40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
ed50: 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20  ( testAddr ){.  
ed60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ed70: 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64  pHere(v, testAdd
ed80: 72 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  r-1);.  }.  sqli
ed90: 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
eda0: 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72  pParse, 1);..  r
edb0: 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65  eturn rReg;.}.#e
edc0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
edd0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
ede0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
edf0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
ee00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
ee10: 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72  e for an IN expr
ee20: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
ee30: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
ee40: 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49  ...).**      x I
ee50: 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
ee60: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20   ...).**.** The 
ee70: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28  left-hand side (
ee80: 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72  LHS) is a scalar
ee90: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
eea0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
eeb0: 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e  e (RHS).** is an
eec0: 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
eed0: 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20  r more values.  
eee0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
eef0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48  s true if the LH
ef00: 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  S is.** containe
ef10: 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
ef20: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  .  The value of 
ef30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ef40: 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29  s unknown (NULL)
ef50: 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69  .** if the LHS i
ef60: 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  s NULL or if the
ef70: 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
ef80: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
ef90: 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20   RHS and the.** 
efa0: 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  RHS contains one
efb0: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
efc0: 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lues..**.** This
efd0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
efe0: 65 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d  es code will jum
eff0: 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  p to destIfFalse
f000: 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
f010: 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
f020: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
f030: 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
f040: 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
f050: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
f060: 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
f070: 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
f080: 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
f090: 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
f0a0: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
f0b0: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
f0c0: 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
f0d0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
f0e0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
f0f0: 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eIN(.  Parse *pP
f100: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
f110: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
f120: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
f130: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
f140: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f  Expr,          /
f150: 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73  * The IN express
f160: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
f170: 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f  tIfFalse,      /
f180: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c  * Jump here if L
f190: 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
f1a0: 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a  ned in the RHS *
f1b0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75  /.  int destIfNu
f1c0: 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ll        /* Jum
f1d0: 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65  p here if the re
f1e0: 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77  sults are unknow
f1f0: 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a  n due to NULLs *
f200: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48  /.){.  int rRhsH
f210: 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20  asNull = 0;  /* 
f220: 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  Register that is
f230: 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e   true if RHS con
f240: 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
f250: 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  s */.  char affi
f260: 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  nity;        /* 
f270: 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e  Comparison affin
f280: 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ity to use */.  
f290: 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
f2a0: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
f2b0: 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
f2c0: 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
f2d0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
f2e0: 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
f2f0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
f300: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
f310: 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
f320: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  truction */..  /
f330: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48  * Compute the RH
f340: 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20  S.   After this 
f350: 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20  step, the table 
f360: 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a  with cursor.  **
f370: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77   pExpr->iTable w
f380: 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ill contains the
f390: 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
f3a0: 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20  e up the RHS..  
f3b0: 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
f3c0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
f3d0: 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
f3e0: 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
f3f0: 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
f400: 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
f410: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
f420: 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
f430: 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
f440: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
f450: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
f460: 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20  RhsHasNull);..  
f470: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
f480: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
f490: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
f4a0: 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
f4b0: 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65  ts.  ** of the e
f4c0: 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e  xpression. affin
f4d0: 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20  ityStr stores a 
f4e0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75  static string su
f4f0: 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20  itable for.  ** 
f500: 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63  P4 of OP_MakeRec
f510: 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69  ord..  */.  affi
f520: 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
f530: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
f540: 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  ;..  /* Code the
f550: 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
f560: 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
f570: 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20   (...)"..  */.  
f580: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
f590: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
f5a0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
f5b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f5c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f5d0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f5e0: 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20  >pLeft, r1);..  
f5f0: 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  /* If the LHS is
f600: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
f610: 72 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72  result is either
f620: 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64   false or NULL d
f630: 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e  epending.  ** on
f640: 20 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53   whether the RHS
f650: 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74   is empty or not
f660: 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
f670: 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
f680: 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
f690: 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f  se ){.    /* Sho
f6a0: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f  rtcut for the co
f6b0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
f6c0: 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55  the false and NU
f6d0: 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a  LL outcomes are.
f6e0: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
f6f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f700: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f710: 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74  IsNull, r1, dest
f720: 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
f730: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 20  {.    int addr1 
f740: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f750: 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
f760: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  l, r1);.    sqli
f770: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f780: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
f790: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
f7a0: 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c  fFalse);.    sql
f7b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f7c0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
f7d0: 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  stIfNull);.    s
f7e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f7f0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
f800: 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
f810: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
f820: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
f830: 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
f840: 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
f850: 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20  able b-tree.    
f860: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
f870: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
f880: 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65  ustBeInt, r1, de
f890: 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
f8a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8b0: 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
f8c0: 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
f8d0: 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
f8e0: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
f8f0: 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
f900: 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20  , the RHS is an 
f910: 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20  index b-tree..  
f920: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
f930: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
f940: 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31  _Affinity, r1, 1
f950: 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
f960: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  1);..    /* If t
f970: 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
f980: 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
f990: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
f9a0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78 20   the .    ** "x 
f9b0: 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
f9c0: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
f9d0: 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
f9e0: 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a 2a  f the set.    **
f9f0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
fa00: 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74  L values, then t
fa10: 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20  he result is 0. 
fa20: 49 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20  If the set .    
fa30: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ** contains one 
fa40: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
fa50: 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
fa60: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20  sult of the.    
fa70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
fa80: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20   also NULL..    
fa90: 2a 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73 48  */.    if( rRhsH
faa0: 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73  asNull==0 || des
fab0: 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
fac0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Null ){.      /*
fad0: 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
fae0: 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e  s if it is known
faf0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
fb00: 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20   that the RHS.  
fb10: 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f      ** cannot co
fb20: 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65  ntain NULL value
fb30: 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
fb40: 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  as the result.  
fb50: 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54      ** of a "NOT
fb60: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
fb70: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
fb80: 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20  e schema..      
fb90: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  **.      ** Also
fba0: 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68   run this branch
fbb0: 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69   if NULL is equi
fbc0: 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a  valent to FALSE.
fbd0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69        ** for thi
fbe0: 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20  s particular IN 
fbf0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20  operator..      
fc00: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fc10: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
fc20: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
fc30: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
fc40: 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29  tIfFalse, r1, 1)
fc50: 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ;..    }else{.  
fc60: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62      /* In this b
fc70: 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f  ranch, the RHS o
fc80: 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63  f the IN might c
fc90: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e  ontain a NULL an
fca0: 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  d.      ** the p
fcb0: 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c  resence of a NUL
fcc0: 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b  L on the RHS mak
fcd0: 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20  es a difference 
fce0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
fcf0: 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a  outcome..      *
fd00: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20  /.      int j1, 
fd10: 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f  j2, j3;..      /
fd20: 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
fd30: 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
fd40: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
fd50: 74 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c  the RHS.  If so,
fd60: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
fd70: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e  he presence of N
fd80: 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20  ULLs in the RHS 
fd90: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c  does not matter,
fda0: 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a   so jump.      *
fdb0: 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  * over all of th
fdc0: 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
fdd0: 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ows..      */.  
fde0: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
fdf0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
fe00: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
fe10: 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c  ->iTable, 0, r1,
fe20: 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48   1);..      /* H
fe30: 65 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e  ere we begin gen
fe40: 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61  erating code tha
fe50: 74 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48  t runs if the LH
fe60: 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  S is not.      *
fe70: 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
fe80: 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e  in the RHS.  Gen
fe90: 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  erate additional
fea0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20   code that.     
feb0: 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48   ** tests the RH
fec0: 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66  S for NULLs.  If
fed0: 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e   the RHS contain
fee0: 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20  s a NULL then.  
fef0: 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64      ** jump to d
ff00: 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
ff10: 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c  here are no NULL
ff20: 73 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  s in the RHS the
ff30: 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20  n.      ** jump 
ff40: 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a  to destIfFalse..
ff50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
ff60: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
ff70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
ff80: 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
ff90: 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73 71  );.      j3 = sq
ffa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
ffb0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
ffc0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
ffd0: 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31  , rRhsHasNull, 1
ffe0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fff0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10000 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 52  _Integer, -1, rR
10010 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  hsHasNull);.    
10020 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10030 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20  pHere(v, j3);.  
10040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
10060 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  mm, rRhsHasNull,
10070 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
10080 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10090 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  , j2);..      /*
100a0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70   Jump to the app
100b0 72 6f 70 72 69 61 74 65 20 74 61 72 67 65 74 20  ropriate target 
100c0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
100d0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
100e0 20 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f 6e    ** the RHS con
100f0 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20  tains a NULL.   
10100 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
10110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10120 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e   OP_If, rRhsHasN
10130 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
10140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10150 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10160 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46  Goto, 0, destIfF
10170 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  alse);..      /*
10180 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74   The OP_Found at
10190 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
101a0 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65   branch jumps he
101b0 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20  re when true, . 
101c0 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20       ** causing 
101d0 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65  the overall IN e
101e0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
101f0 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72  tion to fall thr
10200 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ough..      */. 
10210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10220 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
10230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
10240 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10250 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
10260 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
10270 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
10280 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
10290 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
102a0 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  "));.}.#endif /*
102b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
102c0 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
102d0 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62  Duplicate an 8-b
102e0 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61  yte value.*/.sta
102f0 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79  tic char *dup8by
10300 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  tes(Vdbe *v, con
10310 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20  st char *in){.  
10320 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69  char *out = sqli
10330 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73  te3DbMallocRaw(s
10340 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
10350 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29   8);.  if( out )
10360 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74  {.    memcpy(out
10370 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20  , in, 8);.  }.  
10380 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23  return out;.}..#
10390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
103a0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
103b0 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
103c0 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
103d0 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
103e0 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
103f0 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
10400 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
10410 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
10420 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
10430 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
10440 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
10450 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
10460 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
10470 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
10480 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
10490 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
104a0 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
104b0 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
104c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
104d0 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
104e0 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
104f0 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
10500 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
10510 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
10520 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
10530 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
10540 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72   value;.    char
10550 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65   *zV;.    sqlite
10560 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
10570 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
10580 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
10590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
105a0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
105b0 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
105c0 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
105d0 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
105e0 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
105f0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
10600 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79  .    zV = dup8by
10610 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
10620 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alue);.    sqlit
10630 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10640 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
10650 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c  , 0, zV, P4_REAL
10660 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
10670 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10680 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
10690 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
106a0 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
106b0 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
106c0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
106d0 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
106e0 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
106f0 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
10700 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
10710 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
10720 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
10730 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
10740 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
10750 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
10760 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
10770 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
10780 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
10790 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
107a0 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
107b0 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
107c0 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
107d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
107e0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
107f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10800 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10810 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
10820 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
10830 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
10840 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10850 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
10860 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
10870 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
10880 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c  sqlite3Atoi64(z,
10890 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
108a0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
108b0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69  ITE_UTF8);.    i
108c0 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32  f( c==0 || (c==2
108d0 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a   && negFlag) ){.
108e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a        char *zV;.
108f0 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
10900 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d  g ){ value = c==
10910 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  2 ? SMALLEST_INT
10920 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20  64 : -value; }. 
10930 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
10940 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
10950 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
10960 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10970 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
10980 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49  Mem, 0, zV, P4_I
10990 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
109a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
109b0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
109c0 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
109d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
109e0 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
109f0 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
10a00 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
10a10 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20   z);.#else.     
10a20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
10a30 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
10a40 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
10a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
10a60 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a  a cache entry..*
10a70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
10a80 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61  cheEntryClear(Pa
10a90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
10aa0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
10ab0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70  ){.  if( p->temp
10ac0 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Reg ){.    if( p
10ad0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
10ae0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
10af0 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
10b00 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65       pParse->aTe
10b10 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
10b20 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69  empReg++] = p->i
10b30 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Reg;.    }.    p
10b40 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
10b50 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
10b60 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
10b70 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
10b80 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
10b90 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
10ba0 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
10bb0 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
10bc0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
10bd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
10be0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
10bf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
10c00 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
10c10 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
10c20 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
10c30 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
10c40 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
10c50 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  che *p;..  asser
10c60 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a  t( iReg>0 );  /*
10c70 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   Register number
10c80 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
10c90 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72  itive */.  asser
10ca0 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
10cb0 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
10cc0 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
10cd0 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
10ce0 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  The SQLITE_Colum
10cf0 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61  nCache flag disa
10d00 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  bles the column 
10d10 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20  cache.  This is 
10d20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65  used.  ** for te
10d30 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20  sting only - to 
10d40 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69  verify that SQLi
10d50 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74  te always gets t
10d60 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
10d70 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74   ** with and wit
10d80 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  hout the column 
10d90 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
10da0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
10db0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6c  ags & SQLITE_Col
10dc0 75 6d 6e 43 61 63 68 65 20 29 20 72 65 74 75 72  umnCache ) retur
10dd0 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
10de0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
10df0 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
10e00 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
10e10 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
10e20 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
10e30 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
10e40 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
10e50 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
10e60 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
10e70 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
10e80 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
10e90 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
10ea0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
10eb0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
10ec0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
10ed0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
10ee0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 23 69  E; i++, p++){.#i
10ef0 66 20 30 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  f 0 /* This code
10f00 20 77 6f 6c 64 20 72 65 6d 6f 76 65 20 74 68 65   wold remove the
10f10 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
10f20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
10f30 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ted */.    if( p
10f40 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54 61  ->iReg && p->iTa
10f50 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e  ble==iTab && p->
10f60 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b  iColumn==iCol ){
10f70 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
10f80 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
10f90 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  );.      p->iLev
10fa0 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
10fb0 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
10fc0 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
10fd0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
10fe0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
10ff0 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
11000 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11010 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
11020 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
11030 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
11040 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
11050 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
11060 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
11070 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
11080 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
11090 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
110a0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
110b0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
110c0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
110d0 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
110e0 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
110f0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
11100 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
11110 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
11120 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
11130 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
11140 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
11150 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
11160 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
11170 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
11180 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
11190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
111a0 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61  * Replace the la
111b0 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
111c0 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30   */.  minLru = 0
111d0 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78  x7fffffff;.  idx
111e0 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  Lru = -1;.  for(
111f0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11200 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11210 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11220 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11230 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
11240 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20  ){.      idxLru 
11250 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72  = i;.      minLr
11260 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20  u = p->lru;.    
11270 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41  }.  }.  if( ALWA
11280 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b  YS(idxLru>=0) ){
11290 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
112a0 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
112b0 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76  ru];.    p->iLev
112c0 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
112d0 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d  cheLevel;.    p-
112e0 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
112f0 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
11300 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52   iCol;.    p->iR
11310 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
11320 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
11330 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
11340 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
11350 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
11370 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
11380 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
11390 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
113a0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
113b0 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
113c0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
113d0 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
113e0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
113f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11400 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
11410 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
11420 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
11430 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73  nt i;.  int iLas
11440 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20  t = iReg + nReg 
11450 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43  - 1;.  struct yC
11460 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
11470 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11480 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11490 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
114a0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
114b0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
114c0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67  .    if( r>=iReg
114d0 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a   && r<=iLast ){.
114e0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
114f0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
11500 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
11510 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
11520 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
11530 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
11540 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
11550 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
11560 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
11570 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
11580 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
11590 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
115a0 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
115b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
115c0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
115d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
115e0 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
115f0 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
11600 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d  iCacheLevel++;.}
11610 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
11620 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
11630 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
11640 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
11650 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
11660 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73  e previous N Pus
11670 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49  h operations.  I
11680 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
11690 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65  estore the cache
116a0 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65  .** to the state
116b0 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73   it was in N Pus
116c0 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64  hes ago..*/.void
116d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
116e0 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
116f0 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  se, int N){.  in
11700 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
11710 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
11720 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61  sert( N>0 );.  a
11730 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
11740 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b  CacheLevel>=N );
11750 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
11760 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66  eLevel -= N;.  f
11770 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
11780 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
11790 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
117a0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
117b0 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
117c0 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
117d0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
117e0 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
117f0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
11800 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
11810 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
11820 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
11830 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
11840 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
11850 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
11860 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
11870 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
11880 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
11890 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
118a0 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
118b0 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
118c0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
118d0 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
118e0 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
118f0 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
11900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11910 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11920 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
11930 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11940 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
11950 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11960 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
11970 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11980 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11990 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
119a0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
119b0 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
119c0 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
119d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
119e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
119f0 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
11a00 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
11a10 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
11a20 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
11a30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
11a40 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
11a50 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
11a60 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
11a70 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
11a80 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
11a90 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
11aa0 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
11ab0 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
11ac0 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
11ad0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
11ae0 72 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  r for this table
11af0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
11b00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
11b10 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
11b20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
11b30 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
11b40 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
11b50 64 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  d into this regi
11b60 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
11b70 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
11b80 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
11b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11ba0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
11bb0 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
11bc0 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
11bd0 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
11be0 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
11bf0 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
11c00 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
11c10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
11c20 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c  , iTabCur, iCol,
11c30 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
11c40 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
11c50 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
11c60 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
11c70 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
11c80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
11c90 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
11ca0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
11cb0 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
11cc0 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
11cd0 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
11ce0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
11cf0 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
11d00 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
11d10 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
11d20 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
11d30 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
11d40 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
11d50 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
11d60 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
11d70 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
11d80 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
11d90 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
11da0 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
11db0 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
11dc0 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
11dd0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
11de0 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
11df0 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
11e00 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
11e10 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
11e20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11e30 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
11e40 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
11e50 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
11e60 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
11e70 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
11e80 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
11e90 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
11ea0 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
11eb0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
11ec0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
11ed0 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
11ee0 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
11ef0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
11f00 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
11f10 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
11f20 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
11f30 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20   */.  int iReg  
11f40 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
11f50 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
11f60 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
11f70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
11f80 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
11f90 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
11fa0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11fb0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11fc0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11fd0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11fe0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
11ff0 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
12000 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
12010 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
12020 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
12030 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
12040 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
12050 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
12060 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
12070 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
12080 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
12090 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
120a0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
120b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
120c0 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
120d0 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
120e0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
120f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12100 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
12110 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
12120 69 52 65 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  iReg);.  return 
12130 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  iReg;.}../*.** C
12140 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  lear all column 
12150 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a  cache entries..*
12160 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
12170 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72  prCacheClear(Par
12180 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
12190 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
121a0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
121b0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
121c0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
121d0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
121e0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
121f0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b    if( p->iReg ){
12200 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
12210 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
12220 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
12230 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12240 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
12250 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
12260 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
12270 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
12280 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
12290 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
122a0 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
122b0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
122c0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
122d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
122e0 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
122f0 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
12300 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
12310 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
12320 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
12330 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12340 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
12350 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
12360 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
12370 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
12380 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
12390 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
123a0 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
123b0 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
123c0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
123d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
123e0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
123f0 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
12400 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
12410 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
12420 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d   if( NEVER(iFrom
12430 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b  ==iTo) ) return;
12440 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12450 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
12460 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
12470 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
12480 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12490 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
124a0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
124b0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
124c0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69      int x = p->i
124d0 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  Reg;.    if( x>=
124e0 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d  iFrom && x<iFrom
124f0 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70  +nReg ){.      p
12500 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46  ->iReg += iTo-iF
12510 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rom;.    }.  }.}
12520 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12530 20 63 6f 64 65 20 74 6f 20 63 6f 70 79 20 63 6f   code to copy co
12540 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
12550 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
12560 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
12570 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
12580 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eg-1..*/.void sq
12590 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
125a0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
125b0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
125c0 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
125d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 4e    int i;.  if( N
125e0 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29  EVER(iFrom==iTo)
125f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
12600 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b  (i=0; i<nReg; i+
12610 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
12620 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
12630 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
12640 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69  , iFrom+i, iTo+i
12650 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  );.  }.}..#if de
12660 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
12670 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
12680 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
12690 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
126a0 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65  n true if any re
126b0 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
126c0 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28  nge iFrom..iTo (
126d0 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73  inclusive).** is
126e0 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
126f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
12700 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
12710 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69  utine is used wi
12720 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e  thin assert() an
12730 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  d testcase() mac
12740 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20  ros only.** and 
12750 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
12760 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  in a normal buil
12770 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12780 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
12790 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
127a0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
127b0 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iTo){.  int i;.
127c0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
127d0 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
127e0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
127f0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
12800 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
12810 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
12820 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
12830 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20  if( r>=iFrom && 
12840 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20  r<=iTo ) return 
12850 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  1;    /*NO_TEST*
12860 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  /.  }.  return 0
12870 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12880 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51  LITE_DEBUG || SQ
12890 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
128a0 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ST */../*.** Gen
128b0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
128c0 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
128d0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
128e0 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
128f0 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
12900 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
12910 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
12920 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
12930 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
12940 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
12950 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
12960 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
12970 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
12980 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
12990 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
129a0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
129b0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
129c0 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
129d0 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
129e0 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
129f0 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
12a00 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
12a10 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
12a20 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
12a30 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
12a40 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
12a50 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
12a60 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
12a70 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
12a80 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
12a90 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
12aa0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
12ab0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
12ac0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
12ad0 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
12ae0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
12af0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
12b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12b10 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
12b20 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
12b30 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
12b40 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
12b50 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
12b60 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
12b70 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
12b80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
12b90 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
12ba0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
12bb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
12bc0 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
12bd0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
12be0 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
12bf0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
12c00 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
12c10 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
12c20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
12c30 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
12c40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12c50 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
12c60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12c70 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
12c80 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
12c90 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
12ca0 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
12cb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12cc0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
12cd0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
12ce0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
12cf0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
12d00 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
12d10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
12d20 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
12d30 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
12d40 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
12d50 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
12d60 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
12d70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
12d80 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
12d90 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
12da0 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
12db0 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
12dc0 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
12dd0 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
12de0 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
12df0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
12e00 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
12e10 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
12e20 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
12e30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
12e40 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
12e50 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
12e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12e70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12e80 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
12e90 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
12ec0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
12ed0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12ee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12ef0 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
12f00 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
12f10 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
12f20 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
12f30 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
12f40 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
12f50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
12f60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
12f70 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
12f80 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
12f90 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
12fa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12fb0 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
12fc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
12fd0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
12fe0 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
12ff0 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Base;.      }els
13000 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
13010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13020 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
13030 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
13070 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
13080 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13090 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
130a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
130b0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
130c0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
130d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
130e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
130f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
13100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13110 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
13120 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
13130 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
13140 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
13150 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
13160 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
13170 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
13180 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
13190 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
131a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
131b0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
131c0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
131d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
131e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
131f0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
13200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13210 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
13220 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c  ing8, 0, target,
13230 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
13240 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ken, 0);.      b
13250 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13260 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
13270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13280 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
13290 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
132a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
132b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
132c0 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
132d0 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
132e0 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
132f0 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
13300 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
13310 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
13320 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
13330 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
13340 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
13350 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13360 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13370 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
13380 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
13390 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
133a0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
133b0 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
133c0 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
133d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
133e0 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
133f0 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
13400 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13410 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
13420 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
13430 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
13440 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
13450 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
13460 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13470 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
13480 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
13490 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
134a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
134b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
134c0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
134d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
134e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
134f0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13500 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
13510 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
13520 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
13530 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13540 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
13550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13560 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
13570 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
13580 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
13590 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
135a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
135b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
135c0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
135d0 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 75  (v, -1, pExpr->u
135e0 2e 7a 54 6f 6b 65 6e 2c 20 50 34 5f 54 52 41 4e  .zToken, P4_TRAN
135f0 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
13600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13610 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
13620 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
13630 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
13640 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
13650 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13660 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
13670 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
13680 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
13690 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
136a0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
136b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
136c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
136d0 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
136e0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
136f0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
13700 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
13710 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
13720 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
13730 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70    int aff, to_op
13740 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
13750 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13760 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
13770 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
13780 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  et);.      asser
13790 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
137a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
137b0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
137c0 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66   aff = sqlite3Af
137d0 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
137e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
137f0 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d     to_op = aff -
13800 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
13810 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20   + OP_ToText;.  
13820 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
13830 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
13840 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
13850 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
13860 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
13870 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20  p==OP_ToBlob    
13880 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
13890 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20  FF_NONE    );.  
138a0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
138b0 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
138c0 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
138d0 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
138e0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
138f0 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20  p==OP_ToInt     
13900 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
13910 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
13920 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
13930 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
13940 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
13950 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
13960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
13970 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29  _op==OP_ToText )
13980 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13990 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
139a0 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ob );.      test
139b0 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
139c0 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20  ToNumeric );.   
139d0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
139e0 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a  op==OP_ToInt );.
139f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13a00 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
13a10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e   );.      if( in
13a20 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
13a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13a40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
13a50 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
13a60 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
13a70 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
13a80 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13a90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13aa0 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a   to_op, inReg);.
13ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13ac0 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
13ad0 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
13ae0 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20   inReg) );.     
13af0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
13b00 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
13b10 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31  pParse, inReg, 1
13b20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13b30 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
13b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
13b50 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
13b60 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
13b70 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
13b80 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
13b90 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
13ba0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
13bb0 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
13bc0 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
13bd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13be0 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
13bf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13c00 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
13c10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13c20 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
13c30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
13c40 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
13c50 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
13c60 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
13c70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13c80 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
13c90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45  tcase( op==TK_LE
13ca0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13cb0 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  se( op==TK_GT );
13cc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13cd0 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
13ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13cf0 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
13d00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13d10 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 72 31  K_NE );.      r1
13d20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13d30 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
13d40 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
13d50 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
13d60 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
13d70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
13d80 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
13d90 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
13da0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
13db0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13dc0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
13dd0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
13de0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
13df0 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
13e00 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 74 65  OREP2);.      te
13e10 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
13e20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
13e30 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
13e40 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
13e50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13e60 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
13e70 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20  e TK_ISNOT: {.  
13e80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13e90 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
13ea0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13eb0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
13ec0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
13ed0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
13ee0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
13ef0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
13f00 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
13f10 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13f20 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
13f30 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
13f40 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
13f50 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
13f60 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_NE;.      code
13f70 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
13f80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
13f90 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
13fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13fb0 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
13fc0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
13fd0 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   | SQLITE_NULLEQ
13fe0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13ff0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
14000 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14010 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14020 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14030 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14040 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
14050 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
14060 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
14070 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
14080 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
14090 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
140a0 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
140b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
140c0 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
140d0 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
140e0 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
140f0 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
14100 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
14110 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
14120 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
14130 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nd );.      asse
14140 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
14150 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14160 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
14170 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
14180 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
14190 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20  Subtract );.    
141a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
141b0 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
141c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
141d0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
141e0 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  tAnd );.      as
141f0 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
14200 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20  OP_BitOr );.    
14210 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
14220 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
14230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14240 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
14250 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  ftLeft );.      
14260 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
14270 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
14280 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14290 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
142a0 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20  Concat );.      
142b0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
142c0 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65  _AND );.      te
142d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
142e0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
142f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
14300 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14310 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
14320 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14330 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
14340 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14350 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
14360 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14370 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
14380 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14390 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
143a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
143b0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
143c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
143d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46  se( op==TK_RSHIF
143e0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
143f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
14400 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
14410 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14420 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14430 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
14440 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
14450 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14460 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14470 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
14480 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
14490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
144a0 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
144b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
144c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
144d0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
144e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
144f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
14500 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14510 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
14520 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
14530 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
14540 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14550 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
14560 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
14570 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
14580 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
14590 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
145a0 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64  , target);.#ifnd
145b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
145c0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
145d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
145e0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
145f0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
14600 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
14610 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14620 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
14630 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
14640 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
14650 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65  , 1, target);.#e
14660 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
14670 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  {.        regFre
14680 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65  e1 = r1 = sqlite
14690 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
146a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
146b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
146c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
146d0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32   r1);.        r2
146e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
146f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
14700 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
14710 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
14720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14730 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
14740 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
14750 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
14760 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
14770 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
14780 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
14790 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
147a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
147b0 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
147c0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
147d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
147e0 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
147f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14800 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
14810 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14820 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
14830 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14840 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  se( op==TK_NOT )
14850 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14860 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14870 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14880 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14890 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
148a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
148b0 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
148c0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71  target;.      sq
148d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
148e0 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67  v, op, r1, inReg
148f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14900 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14910 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
14920 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
14930 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
14940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14950 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
14960 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
14970 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
14980 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
14990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
149a0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
149b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
149c0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
149d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
149e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
149f0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
14a00 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
14a10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14a20 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14a30 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14a40 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
14a50 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
14a60 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
14a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14a80 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
14a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14aa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
14ab0 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31  dImm, target, -1
14ac0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14ad0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14ae0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
14af0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14b00 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
14b10 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
14b20 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
14b30 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
14b40 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
14b50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
14b60 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
14b70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
14b80 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
14b90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14ba0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
14bb0 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
14bc0 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
14bd0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
14be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14bf0 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
14c00 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
14c10 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
14c20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14c30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
14c40 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
14c50 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
14c60 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
14c70 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
14c80 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
14c90 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
14ca0 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
14cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14cc0 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
14cd0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
14ce0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
14cf0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
14d00 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
14d10 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
14d20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  */.      int nId
14d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14d40 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
14d50 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69   function name i
14d60 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
14d70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
14d80 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
14d90 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
14da0 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d        int constM
14db0 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
14dc0 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
14dd0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
14de0 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
14df0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e10 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
14e20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
14e30 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20  NC(db);      /* 
14e40 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  The text encodin
14e50 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64  g used by this d
14e60 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
14e70 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
14e80 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c  = 0;    /* A col
14e90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
14ea0 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
14eb0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14ec0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
14ed0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
14ee0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14ef0 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a  K_CONST_FUNC );.
14f00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14f10 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
14f20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
14f30 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
14f40 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
14f50 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
14f60 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
14f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14f80 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
14f90 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
14fa0 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
14fb0 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
14fc0 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
14fd0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
14fe0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14ff0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
15000 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
15010 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
15020 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74   nId = sqlite3St
15030 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20  rlen30(zId);.   
15040 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
15050 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
15060 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72  , zId, nId, nFar
15070 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  g, enc, 0);.    
15080 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
15090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
150a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
150b0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
150c0 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  on: %.*s()", nId
150d0 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
150e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
150f0 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
15100 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
15110 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
15120 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
15130 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
15140 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
15150 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
15160 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
15170 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  alation of.     
15180 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61   ** arguments pa
15190 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  st the first non
151a0 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a  -NULL argument..
151b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
151c0 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  f( pDef->flags &
151d0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
151e0 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20  LESCE ){.       
151f0 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65   int endCoalesce
15200 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15210 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
15220 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
15230 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=2 );.        
15240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
15250 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
15260 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
15270 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
15280 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=1; i<nFarg; i+
15290 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
152a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
152b0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74  v, OP_NotNull, t
152c0 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73  arget, endCoales
152d0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ce);.          s
152e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
152f0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
15300 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
15310 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15320 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
15330 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15340 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15350 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
15360 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
15370 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15380 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
15390 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
153a0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
153b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
153c0 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73  bel(v, endCoales
153d0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ce);.        bre
153e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  ak;.      }...  
153f0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
15400 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
15410 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
15420 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
15430 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15440 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
15450 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
15460 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
15470 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
15480 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
15490 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
154a0 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  arg, r1, 1);.   
154b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
154c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
154d0 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74   1);   /* Ticket
154e0 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
154f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15500 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
15510 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
15520 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15530 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
15540 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
15550 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
15560 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
15570 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
15580 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
15590 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
155a0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
155b0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
155c0 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
155d0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
155e0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
155f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
15600 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
15610 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
15620 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
15630 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
15640 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
15650 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
15660 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
15670 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
15680 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
15690 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
156a0 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
156b0 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
156c0 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
156d0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
156e0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
156f0 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
15700 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
15710 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
15720 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
15730 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
15740 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
15750 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
15760 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
15770 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
15780 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
15790 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
157a0 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
157b0 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
157c0 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
157d0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
157e0 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
157f0 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
15800 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
15810 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
15820 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
15830 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
15840 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
15850 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
15860 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
15870 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
15880 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
15890 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
158a0 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
158b0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
158c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
158d0 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  f.      for(i=0;
158e0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
158f0 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
15900 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
15910 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
15920 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
15930 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
15940 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20  ask |= (1<<i);. 
15950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15960 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67   if( (pDef->flag
15970 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
15980 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
15990 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
159a0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
159b0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
159c0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
159d0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
159e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
159f0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61     if( pDef->fla
15a00 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
15a10 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
15a20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
15a30 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
15a40 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
15a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a60 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
15a70 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
15a80 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
15a90 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
15aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ab0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
15ac0 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73  nction, constMas
15ad0 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
15b00 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
15b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15b20 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
15b30 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
15b40 69 66 28 20 6e 46 61 72 67 20 29 7b 0a 20 20 20  if( nFarg ){.   
15b50 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15b60 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
15b70 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
15b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15b90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
15ba0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15bb0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
15bc0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
15bd0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
15be0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
15bf0 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
15c00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15c10 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
15c20 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  T );.      inReg
15c30 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
15c40 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
15c50 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
15c60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15c70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
15c80 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
15c90 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
15ca0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15cb0 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
15cc0 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
15cd0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15ce0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
15cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15d00 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
15d10 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
15d20 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
15d30 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
15d40 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
15d50 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
15d60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15d70 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
15d80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
15d90 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15da0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
15db0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
15dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15dd0 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
15de0 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
15df0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15e00 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
15e10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
15e20 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
15e30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
15e40 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
15e50 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
15e60 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
15e70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15e80 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
15e90 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
15ea0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
15eb0 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
15ec0 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
15ed0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
15ee0 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
15ef0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
15f00 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
15f10 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
15f20 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
15f30 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
15f40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
15f50 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
15f60 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
15f70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
15f80 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
15f90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
15fa0 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  m = pExpr->x.pLi
15fb0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
15fc0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
15fd0 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
15fe0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
15ff0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16000 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
16010 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
16020 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16030 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
16040 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
16050 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16060 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16080 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16090 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
160a0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
160b0 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
160c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
160d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
160e0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
160f0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
16100 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
16120 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
16130 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
16140 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
16150 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
16160 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
16170 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16180 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
16190 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
161a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
161b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
161c0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
161d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
161e0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
161f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
16200 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
16210 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
16220 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
16230 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
16240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16250 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c  ddOp3(v, OP_And,
16260 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29   r3, r4, target)
16270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16280 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16290 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20  arse, r3);.     
162a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
162b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
162c0 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
162d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
162e0 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
162f0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
16300 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
16310 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16320 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
16330 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16340 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
16350 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
16360 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
16370 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
16380 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
16390 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
163a0 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
163b0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
163c0 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
163d0 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
163e0 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
163f0 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
16400 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
16410 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
16420 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
16430 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
16440 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
16450 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
16460 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
16470 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
16480 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
16490 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
164a0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
164b0 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
164c0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
164d0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
164e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
164f0 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
16500 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
16510 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
16520 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
16530 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
16540 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
16550 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
16560 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
16570 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
16580 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
16590 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
165a0 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
165b0 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
165c0 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
165d0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
165e0 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
165f0 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
16600 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
16610 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
16620 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
16630 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
16640 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
16650 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
16660 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
16670 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
16680 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
16690 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
166a0 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
166b0 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
166c0 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
166d0 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
166e0 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
166f0 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
16700 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
16710 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
16720 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
16730 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
16740 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
16750 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
16760 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
16770 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16780 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
16790 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
167a0 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
167b0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
167c0 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
167d0 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
167e0 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
167f0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
16800 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
16810 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
16820 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
16830 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
16840 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
16850 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
16860 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
16870 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
16880 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
16890 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
168a0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
168b0 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
168c0 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
168d0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
168e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
168f0 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
16900 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
16910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
16920 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
16930 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
16940 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
16950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
16960 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
16970 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
16980 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
16990 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
169a0 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
169b0 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
169c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
169d0 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
169e0 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
169f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16a00 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
16a10 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
16a20 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
16a30 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
16a40 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
16a50 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
16a60 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
16a70 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
16a80 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
16a90 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
16aa0 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
16ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
16ac0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
16ad0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
16ae0 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
16af0 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
16b00 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
16b10 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
16b20 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
16b30 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
16b40 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
16b50 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a  eally real.  */.
16b60 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16b70 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
16b80 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
16b90 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
16ba0 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
16bb0 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
16bc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
16bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16be0 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
16bf0 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
16c00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
16c10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
16c20 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
16c30 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
16c40 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
16c50 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
16c60 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
16c70 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
16c80 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
16c90 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
16ca0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
16cb0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
16cc0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
16cd0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
16ce0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
16cf0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
16d00 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
16d10 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
16d20 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
16d30 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
16d40 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
16d50 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
16d60 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
16d70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
16d80 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
16d90 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
16da0 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
16db0 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
16dc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
16dd0 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78    ** Y is in pEx
16de0 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65  pr->pRight.  The
16df0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
16e00 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69  nal.  If there i
16e10 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45  s no.    ** ELSE
16e20 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f   clause and no o
16e30 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65  ther term matche
16e40 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
16e50 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  lt of the.    **
16e60 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55   exprssion is NU
16e70 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
16e80 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
16e90 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
16ea0 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
16eb0 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
16ec0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
16ed0 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
16ee0 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
16ef0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
16f00 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
16f10 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
16f20 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
16f30 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
16f40 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
16f50 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
16f60 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
16f70 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
16f80 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
16f90 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
16fa0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
16fd0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
16fe0 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
16ff0 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17010 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
17020 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
17030 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
17040 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17060 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
17070 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
17080 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
170b0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
170c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170e0 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
170f0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
17100 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
17110 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
17120 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
17130 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
17140 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
17170 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
17180 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20    Expr cacheX;  
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78      /* Cached ex
171b0 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20  pression X */.  
171c0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
171f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
17200 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
17210 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17220 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
17230 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
17240 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
17250 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
17260 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
17270 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
17280 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
17290 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
172a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
172b0 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
172c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
172d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
172e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
172f0 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
17300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
17310 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
17320 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
17330 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
17340 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
17350 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
17360 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
17370 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
17380 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
17390 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
173a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
173b0 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
173c0 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
173d0 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20  .        cacheX 
173e0 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
173f0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
17400 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
17410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17420 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pX->op==TK_REGIS
17430 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63  TER );.        c
17440 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73  acheX.iTable = s
17450 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17460 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26  mp(pParse, pX, &
17470 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17480 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17490 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
174a0 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20      cacheX.op = 
174b0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
174c0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
174d0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
174e0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
174f0 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20  ft = &cacheX;.  
17500 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
17510 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
17520 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
17530 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
17540 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
17550 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
17560 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
17570 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
17580 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
17590 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
175a0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
175b0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
175c0 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
175d0 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
175e0 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
175f0 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
17600 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
17610 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
17620 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
17630 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
17640 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
17650 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  r; i=i+2){.     
17660 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17670 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
17680 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
17690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
176a0 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
176b0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
176c0 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
176d0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
176e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
176f0 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
17700 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
17710 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
17720 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
17730 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
17740 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17750 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17760 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
17770 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
17780 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
17790 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
177a0 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
177b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
177c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
177d0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
177e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
177f0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
17800 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
17810 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
17820 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
17830 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17840 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
17850 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
17860 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
17870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17880 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17890 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61  P_Goto, 0, endLa
178a0 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
178b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
178c0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
178d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
178f0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
17900 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
17910 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
17920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17930 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
17940 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
17950 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
17960 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
17970 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ht, target);.   
17980 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17990 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
179a0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
179b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
179c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
179d0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
179e0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
179f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
17a00 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
17a10 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
17a20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
17a30 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
17a40 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
17a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17a60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17a70 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
17a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
17a90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17aa0 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
17ab0 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
17ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
17ad0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17ae0 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
17af0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
17b00 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
17b10 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
17b20 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
17b30 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
17b40 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
17b50 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
17b60 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
17b70 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
17b80 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
17b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
17ba0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
17bd0 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
17be0 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
17bf0 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
17c00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17c10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17c20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
17c30 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
17c40 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
17c50 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
17c60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
17c70 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
17c80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
17c90 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
17ca0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
17cb0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
17cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17cd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
17ce0 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
17cf0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
17d00 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
17d10 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
17d20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
17d30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17d40 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
17d50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 61 66  Parse, pExpr->af
17d60 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
17d70 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20  .zToken, 0);.   
17d80 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
17d90 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
17da0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
17db0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17dc0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
17dd0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17de0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17df0 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
17e00 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
17e10 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
17e20 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
17e30 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
17e40 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
17e50 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
17e60 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
17e70 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
17e80 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
17e90 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
17ea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
17eb0 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
17ec0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
17ed0 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
17ee0 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
17ef0 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
17f00 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
17f10 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
17f20 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
17f30 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
17f40 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
17f50 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ero..*/.int sqli
17f60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17f70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
17f80 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
17f90 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31  *pReg){.  int r1
17fa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17fb0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17fc0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
17fd0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
17fe0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
17ff0 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20  );.  if( r2==r1 
18000 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72  ){.    *pReg = r
18010 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
18020 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18030 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18040 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30  );.    *pReg = 0
18050 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18060 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
18070 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
18080 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
18090 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
180a0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
180b0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
180c0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
180d0 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
180e0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
180f0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
18100 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73  target..*/.int s
18110 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
18120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
18130 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
18140 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
18150 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
18160 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
18170 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
18180 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
18190 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
181a0 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
181b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
181c0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
181d0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
181e0 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
181f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18200 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
18210 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
18220 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
18230 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
18240 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
18250 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
18260 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
18270 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
18280 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
18290 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
182a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
182b0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
182c0 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
182d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
182e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72    }.  return tar
182f0 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  get;.}../*.** Ge
18300 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
18310 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
18320 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
18330 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
18340 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
18350 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
18360 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
18370 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
18380 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
18390 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
183a0 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
183b0 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
183c0 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
183d0 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
183e0 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
183f0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
18400 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
18410 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
18420 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18430 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
18440 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
18450 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
18460 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
18470 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
18480 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
18490 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
184a0 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
184b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
184c0 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
184d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
184e0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
184f0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
18500 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
18510 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65  Vdbe;.  int inRe
18520 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  g;.  inReg = sql
18530 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
18540 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
18550 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  et);.  assert( t
18560 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20  arget>0 );.  /* 
18570 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
18580 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d 73  called for terms
18590 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55 50   to INSERT or UP
185a0 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20 6f  DATE.  And the o
185b0 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70  nly.  ** other p
185c0 6c 61 63 65 20 77 68 65 72 65 20 65 78 70 72 65  lace where expre
185d0 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f  ssions can be co
185e0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
185f0 52 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a 2a  REGISTER is.  **
18600 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65   in WHERE clause
18610 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
18620 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6d   as currently im
18630 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72 65  plemented, there
18640 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20   is.  ** no way 
18650 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54 45  for a TK_REGISTE
18660 52 20 74 6f 20 65 78 69 73 74 20 68 65 72 65 2e  R to exist here.
18670 20 20 42 75 74 20 69 74 20 73 65 65 6d 73 20 70    But it seems p
18680 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b  rudent to.  ** k
18690 65 65 70 20 74 68 65 20 41 4c 57 41 59 53 28 29  eep the ALWAYS()
186a0 20 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f 6e   in case the con
186b0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63 68  ditions above ch
186c0 61 6e 67 65 20 77 69 74 68 20 66 75 74 75 72 65  ange with future
186d0 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
186e0 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65  ons or enhanceme
186f0 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c  nts. */.  if( AL
18700 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d  WAYS(pExpr->op!=
18710 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b 20  TK_REGISTER) ){ 
18720 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a   .    int iMem;.
18730 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61      iMem = ++pPa
18740 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
18750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18760 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52  (v, OP_Copy, inR
18770 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70  eg, iMem);.    p
18780 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
18790 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
187a0 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b  op2 = pExpr->op;
187b0 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
187c0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
187d0 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  }.  return inReg
187e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
187f0 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72 20  n TRUE if pExpr 
18800 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65  is an constant e
18810 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
18820 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  s appropriate.**
18830 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f   for factoring o
18840 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41  ut of a loop.  A
18850 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72 65  ppropriate expre
18860 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ssions are:.**.*
18870 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72  *    *  Any expr
18880 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c  ession that eval
18890 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20  uates to two or 
188a0 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a  more opcodes..**
188b0 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50  .**    *  Any OP
188c0 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61  _Integer, OP_Rea
188d0 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50  l, OP_String, OP
188e0 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  _Blob, OP_Null, 
188f0 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f  .**       or OP_
18900 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f  Variable that do
18910 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
18920 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a  e placed in a .*
18930 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63  *       specific
18940 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
18950 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
18960 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20  nt in factoring 
18970 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72  out single-instr
18980 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a  uction constant.
18990 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
189a0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  hat need to be p
189b0 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74 69  laced in a parti
189c0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20  cular register. 
189d0 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61   .** We could fa
189e0 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62  ctor them out, b
189f0 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64  ut then we would
18a00 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61   end up adding a
18a10 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e  n.** OP_SCopy in
18a20 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76  struction to mov
18a30 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  e the value into
18a40 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 67   the correct reg
18a50 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20  ister.** later. 
18a60 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
18a70 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f  l just use the o
18a80 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74  riginal instruct
18a90 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64  ion and.** avoid
18aa0 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a   the OP_SCopy..*
18ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
18ac0 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
18ad0 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b  toring(Expr *p){
18ae0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
18af0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
18b00 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72  Join(p) ){.    r
18b10 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c  eturn 0;  /* Onl
18b20 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  y constant expre
18b30 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f  ssions are appro
18b40 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f  priate for facto
18b50 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ring */.  }.  if
18b60 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
18b70 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29  _FixedDest)==0 )
18b80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  {.    return 1; 
18b90 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74   /* Any constant
18ba0 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65 64   without a fixed
18bb0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
18bc0 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20  appropriate */. 
18bd0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f   }.  while( p->o
18be0 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20  p==TK_UPLUS ) p 
18bf0 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77  = p->pLeft;.  sw
18c00 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23  itch( p->op ){.#
18c10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18c20 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
18c30 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
18c40 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
18c50 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
18c60 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
18c70 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
18c80 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
18c90 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  TK_NULL:.    cas
18ca0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
18cb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18cc0 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b  ->op==TK_BLOB );
18cd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18ce0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41   p->op==TK_VARIA
18cf0 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BLE );.      tes
18d00 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
18d10 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
18d20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
18d30 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20  p==TK_FLOAT );. 
18d40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18d50 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b  ->op==TK_NULL );
18d60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18d70 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
18d80 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69  G );.      /* Si
18d90 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
18da0 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   constants with 
18db0 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
18dc0 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ion are.      **
18dd0 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d   better done in-
18de0 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63  line.  If we fac
18df0 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77  tor them, they w
18e00 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20  ill just end.   
18e10 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74     ** up generat
18e20 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20  ing an OP_SCopy 
18e30 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
18e40 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61  e to the destina
18e50 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65  tion.      ** re
18e60 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gister. */.     
18e70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18e80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
18e90 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NUS: {.      if(
18ea0 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
18eb0 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c  K_FLOAT || p->pL
18ec0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
18ed0 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72  GER ){.        r
18ee0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
18ef0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18f00 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
18f10 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   {.      break;.
18f20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18f30 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
18f40 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
18f50 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
18f60 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
18f70 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74  iate for.** fact
18f80 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c  oring out of a l
18f90 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  oop, then evalua
18fa0 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
18fb0 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  n.** into a regi
18fc0 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ster and convert
18fd0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18fe0 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  into a TK_REGIST
18ff0 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ER.** expression
19000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19010 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57 61  evalConstExpr(Wa
19020 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
19030 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 50  xpr *pExpr){.  P
19040 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
19050 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
19060 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
19070 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
19080 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20  TK_IN:.    case 
19090 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
190a0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
190b0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
190c0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
190d0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
190e0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
190f0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
19100 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UNC: {.      /* 
19110 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
19120 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65   a function have
19130 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
19140 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  tion..      ** M
19150 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61  ark them this wa
19160 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72  y to avoid gener
19170 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50  ated unneeded OP
19180 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  _SCopy.      ** 
19190 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20  instructions. . 
191a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
191b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
191c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
191d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
191e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
191f0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
19200 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
19210 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
19220 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
19230 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
19240 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19250 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c  item *pItem = pL
19260 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
19270 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  for(; i>0; i--, 
19280 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
19290 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
192a0 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20 70  Item->pExpr) ) p
192b0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61  Item->pExpr->fla
192c0 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65  gs |= EP_FixedDe
192d0 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  st;.        }.  
192e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
192f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
19300 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  f( isAppropriate
19310 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78  ForFactoring(pEx
19320 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  pr) ){.    int r
19330 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
19340 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a  em;.    int r2;.
19350 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
19360 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
19370 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
19380 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
19390 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c 69 74  (r1!=r2) ) sqlit
193a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
193b0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
193c0 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70    pExpr->op2 = p
193d0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
193e0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
193f0 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72  ISTER;.    pExpr
19400 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20  ->iTable = r2;. 
19410 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
19420 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
19430 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
19440 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c  }../*.** Preeval
19450 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75  uate constant su
19460 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74  bexpressions wit
19470 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  hin pExpr and st
19480 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
19490 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e  ts in registers.
194a0 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73    Modify pExpr s
194b0 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  o that the const
194c0 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e  ant subexpresion
194d0 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49  s.** are TK_REGI
194e0 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61  STER opcodes tha
194f0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 70  t refer to the p
19500 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65  recomputed value
19510 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
19520 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19530 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f 20   if the jump to 
19540 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b  the cookie-check
19550 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c 72   code has.** alr
19560 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69 6e  eady occur.  Sin
19570 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68  ce the cookie-ch
19580 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e 65  eck jump is gene
19590 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a 2a  rated prior to.*
195a0 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72 69  * any other seri
195b0 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c 20  ous processing, 
195c0 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75 72  this check ensur
195d0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
195e0 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61 63   no.** way to ac
195f0 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73 20  cidently bypass 
19600 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 69  the constant ini
19610 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a 2a  tializations..**
19620 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19630 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f 70   is also a no-op
19640 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 46   if the SQLITE_F
19650 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f 70  actorOutConst op
19660 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73  timization.** is
19670 20 64 69 73 61 62 6c 65 64 20 76 69 61 20 74 68   disabled via th
19680 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  e sqlite3_test_c
19690 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
196a0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
196b0 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66 61  IONS).** interfa
196c0 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ce.  This allows
196d0 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20 76   test logic to v
196e0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
196f0 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a 2a  ame answer is.**
19700 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71 75   obtained for qu
19710 65 72 69 65 73 20 72 65 67 61 72 64 6c 65 73 73  eries regardless
19720 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
19730 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  ot constants are
19740 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64 20  .** precomputed 
19750 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 6f  into registers o
19760 72 20 69 66 20 74 68 65 79 20 61 72 65 20 69 6e  r if they are in
19770 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e 0a  serted in-line..
19780 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
19790 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
197a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
197b0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
197c0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28 20  Walker w;.  if( 
197d0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
197e0 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  to ) return;.  i
197f0 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
19800 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
19810 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 21 3d  actorOutConst)!=
19820 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 2e  0 ) return;.  w.
19830 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
19840 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20  evalConstExpr;. 
19850 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
19860 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72  ck = 0;.  w.pPar
19870 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
19880 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
19890 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f  w, pExpr);.}.../
198a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
198b0 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
198c0 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
198d0 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
198e0 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
198f0 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
19900 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
19910 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
19920 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
19930 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
19940 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
19950 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e  evaluated..*/.in
19960 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
19970 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
19980 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
19990 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
199a0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
199b0 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
199c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
199d0 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
199e0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
199f0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
19a00 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
19a10 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43  */.  int doHardC
19a20 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  opy     /* Make 
19a30 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65  a hard copy of e
19a40 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  very element */.
19a50 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
19a60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19a70 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
19a80 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
19a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
19aa0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
19ab0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
19ac0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
19ad0 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
19ae0 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
19af0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
19b00 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
19b10 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b  st->a, i=0; i<n;
19b20 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
19b30 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
19b40 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
19b50 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
19b60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19b70 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
19b80 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
19b90 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
19ba0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
19bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19bc0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
19bd0 2c 20 64 6f 48 61 72 64 43 6f 70 79 20 3f 20 4f  , doHardCopy ? O
19be0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
19bf0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
19c00 20 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67             inReg
19c10 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
19c20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19c30 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
19c40 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
19c50 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
19c60 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
19c70 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
19c80 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
19c90 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
19ca0 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
19cb0 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
19cc0 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
19cd0 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
19ce0 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
19cf0 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65  ression.** eleme
19d00 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f  ntation of x..*/
19d10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
19d20 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20  rCodeBetween(.  
19d30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19d40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
19d50 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
19d60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
19d70 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
19d80 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65  /* The BETWEEN e
19d90 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
19da0 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
19db0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19dc0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
19dd0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  en */.  int jump
19de0 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b  IfTrue,   /* Tak
19df0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
19e00 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75  e BETWEEN is tru
19e10 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
19e20 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
19e30 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
19e40 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
19e50 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78   */.){.  Expr ex
19e60 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
19e70 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
19e80 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
19e90 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
19ea0 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
19eb0 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
19ec0 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
19ed0 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
19ee0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
19ef0 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
19f00 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
19f10 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
19f20 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
19f30 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
19f40 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  gister */..  ass
19f50 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
19f60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
19f70 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
19f80 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
19f90 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
19fa0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
19fb0 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
19fc0 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
19fd0 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
19fe0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
19ff0 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
1a000 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
1a010 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1a020 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
1a030 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1a040 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
1a050 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
1a060 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
1a070 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1a080 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
1a090 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
1a0a0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
1a0b0 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20  .  exprX.iTable 
1a0c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1a0d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1a0e0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1a0f0 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54  ;.  exprX.op = T
1a100 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 69 66  K_REGISTER;.  if
1a110 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a  ( jumpIfTrue ){.
1a120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a130 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
1a140 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1a150 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
1a160 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1a170 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1a180 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1a190 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1a1a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1a1b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a1c0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a  se, regFree1);..
1a1d0 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71    /* Ensure adeq
1a1e0 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61  uate test covera
1a1f0 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ge */.  testcase
1a200 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1a210 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1a220 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1a230 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1a240 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1a250 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1a260 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1a270 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a280 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1a290 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1a2a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1a2b0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a2c0 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1a2d0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1a2e0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1a2f0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a300 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1a310 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1a320 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1a330 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1a340 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1a350 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1a360 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a370 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1a380 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1a390 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1a3a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1a3b0 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1a3c0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1a3d0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a  egFree1!=0 );.}.
1a3e0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a3f0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1a400 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1a410 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1a420 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1a430 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1a440 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a450 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
1a460 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
1a470 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
1a480 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1a490 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
1a4a0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1a4b0 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1a4c0 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1a4d0 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
1a4e0 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
1a4f0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
1a500 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
1a510 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1a520 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
1a530 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1a540 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
1a550 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
1a560 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
1a570 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
1a580 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
1a590 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
1a5a0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
1a5b0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
1a5c0 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
1a5d0 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
1a5e0 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
1a5f0 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
1a600 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
1a610 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
1a620 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
1a630 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
1a640 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
1a650 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
1a660 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
1a670 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
1a680 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
1a690 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1a6a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a6b0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1a6c0 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
1a6d0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
1a6e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1a6f0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
1a700 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1a710 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1a720 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
1a730 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
1a740 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
1a750 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
1a760 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
1a770 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
1a780 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72  ==0) )     retur
1a790 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63 65  n;  /* Existance
1a7a0 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
1a7b0 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
1a7c0 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
1a7d0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
1a7e0 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61  * No way this ca
1a7f0 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70  n happen */.  op
1a800 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1a810 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1a820 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1a830 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1a840 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a850 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1a860 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1a870 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1a880 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a890 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1a8a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a8b0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1a8c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
1a8d0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1a8e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1a8f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a900 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1a910 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1a920 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1a930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a940 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a950 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
1a960 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1a970 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
1a980 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a990 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1a9a0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1a9b0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1a9c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a9d0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1a9e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1a9f0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1aa00 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1aa10 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1aa20 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1aa30 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1aa40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1aa50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1aa60 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1aa70 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1aa80 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1aa90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1aaa0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1aab0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1aac0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1aad0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1aae0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1aaf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1ab00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1ab10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1ab20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1ab30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1ab40 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1ab50 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
1ab60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ab70 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
1ab80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ab90 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
1aba0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
1abb0 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
1abc0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
1abd0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
1abe0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
1abf0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
1ac00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1ac10 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1ac20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
1ac30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ac40 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
1ac50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ac60 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
1ac70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ac80 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
1ac90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1aca0 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
1acb0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1acc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1acd0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ace0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1acf0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1ad00 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1ad10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ad20 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ad30 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1ad40 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1ad50 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1ad60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ad70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ad80 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1ad90 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1ada0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1adb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1adc0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1add0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ade0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1adf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ae00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1ae10 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1ae20 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1ae30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1ae40 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1ae50 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
1ae60 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1ae70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ae80 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1ae90 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1aea0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1aeb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1aec0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1aed0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1aee0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
1aef0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1af00 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1af10 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1af20 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1af30 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1af40 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1af60 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1af70 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1af80 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1af90 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1afa0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1afb0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1afc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1afd0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1afe0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1aff0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
1b000 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1b010 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
1b020 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1b030 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1b040 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
1b050 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1b060 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
1b070 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1b080 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1b090 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b0a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1b0b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1b0c0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1b0d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b0e0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1b0f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b100 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1b110 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b120 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1b130 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1b140 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1b150 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1b160 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1b170 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1b180 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49  , dest, 1, jumpI
1b190 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1b1a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1b1b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b1c0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1b1d0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1b1e0 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
1b1f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b200 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1b210 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1b220 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
1b230 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
1b240 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
1b250 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1b260 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
1b270 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
1b280 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1b290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b2a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
1b2b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b2c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b2d0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1b2e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b2f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1b300 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1b310 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1b320 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1b330 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1b340 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1b350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b360 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
1b370 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1b380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b390 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1b3a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1b3b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1b3c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b3d0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1b3e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1b3f0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1b400 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1b410 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b420 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
1b430 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b440 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1b450 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1b460 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1b470 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1b480 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1b490 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b4a0 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
1b4b0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1b4c0 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1b4d0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1b4e0 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
1b4f0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1b500 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1b510 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1b520 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1b530 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
1b540 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
1b550 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1b560 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
1b570 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
1b580 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
1b590 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1b5a0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1b5b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1b5c0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1b5d0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1b5e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1b5f0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1b600 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1b610 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1b620 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1b630 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1b640 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1b650 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1b660 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1b670 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1b680 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
1b690 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f  ; /* Existance o
1b6a0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
1b6b0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
1b6c0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
1b6d0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
1b6e0 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
1b6f0 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
1b700 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
1b710 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1b720 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
1b730 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
1b740 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
1b750 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
1b760 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
1b770 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
1b780 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
1b790 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
1b7a0 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
1b7b0 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
1b7c0 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
1b7d0 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
1b7e0 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
1b7f0 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
1b800 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
1b810 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
1b820 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1b830 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1b840 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
1b850 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
1b860 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
1b870 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
1b880 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
1b890 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
1b8a0 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
1b8b0 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
1b8c0 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
1b8d0 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
1b8e0 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
1b8f0 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
1b900 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
1b910 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
1b920 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
1b930 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
1b940 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
1b950 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
1b960 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
1b970 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
1b980 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
1b990 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
1b9a0 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
1b9b0 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
1b9c0 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
1b9d0 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
1b9e0 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
1b9f0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
1ba00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1ba10 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
1ba20 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
1ba30 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
1ba40 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1ba50 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
1ba60 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
1ba70 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1ba80 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
1ba90 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
1baa0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1bab0 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
1bac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1bad0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
1bae0 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
1baf0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1bb00 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
1bb10 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
1bb20 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1bb30 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
1bb40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1bb50 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
1bb60 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
1bb70 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1bb80 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1bb90 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
1bba0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1bbb0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1bbc0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1bbd0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1bbe0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1bbf0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1bc00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1bc10 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1bc20 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1bc30 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1bc40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc50 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1bc60 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
1bc70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1bc80 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1bc90 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1bca0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1bcb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1bcc0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1bcd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bce0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1bcf0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1bd00 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
1bd10 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1bd20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bd30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1bd40 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1bd50 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1bd60 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1bd70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1bd80 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1bd90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1bda0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1bdb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bdc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1bdd0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1bde0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1bdf0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1be00 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1be10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1be20 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1be30 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1be40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1be50 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1be60 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1be70 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1be80 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1be90 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1bea0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1beb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1bec0 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
1bed0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1bee0 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
1bef0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1bf00 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
1bf10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
1bf20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bf30 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
1bf40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bf50 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
1bf60 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1bf70 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1bf80 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1bf90 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1bfa0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1bfb0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1bfc0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1bfd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1bfe0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1bff0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1c000 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1c010 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1c020 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1c030 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1c050 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1c060 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
1c070 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1c080 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1c090 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1c0a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1c0b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c0c0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1c0d0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1c0e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c0f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1c100 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c110 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1c120 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1c130 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1c140 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1c150 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1c160 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1c170 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1c180 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1c190 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1c1a0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1c1b0 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
1c1c0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1c1d0 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
1c1e0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1c1f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1c200 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1c210 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1c220 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1c230 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1c240 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1c250 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1c260 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1c270 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1c280 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c2a0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1c2b0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1c2c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1c2d0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1c2e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c2f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1c300 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
1c310 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c320 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1c330 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1c340 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1c350 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c360 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
1c370 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c380 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1c390 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c3a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1c3b0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1c3c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1c3d0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1c3e0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1c3f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c400 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  dest, 0, jumpIfN
1c410 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1c420 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1c430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1c440 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
1c450 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
1c460 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
1c470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c480 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1c490 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
1c4a0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
1c4b0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
1c4c0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1c4d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1c4e0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1c4f0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1c500 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1c510 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
1c520 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c530 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1c540 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
1c550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1c560 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1c570 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1c580 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
1c590 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c5a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c5b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1c5c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c5d0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
1c5e0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
1c5f0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
1c600 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1c610 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1c620 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1c630 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1c640 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c650 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1c660 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1c670 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1c680 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c690 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1c6a0 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
1c6b0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
1c6c0 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
1c6d0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
1c6e0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
1c6f0 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
1c700 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
1c710 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
1c720 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
1c730 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
1c740 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
1c750 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
1c760 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
1c770 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
1c780 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
1c790 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
1c7a0 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
1c7b0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  rator..**.** Som
1c7c0 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
1c7d0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1c7e0 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
1c7f0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
1c800 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
1c810 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
1c820 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
1c830 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1c840 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
1c850 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
1c860 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
1c870 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
1c880 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
1c890 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
1c8a0 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
1c8b0 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
1c8c0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1c8d0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1c8e0 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
1c8f0 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
1c900 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
1c910 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
1c920 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
1c930 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
1c940 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
1c950 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c960 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
1c970 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
1c980 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
1c990 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
1c9a0 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
1c9b0 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
1c9c0 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
1c9d0 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
1c9e0 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
1c9f0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
1ca00 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1ca10 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ca20 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
1ca30 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41 3d 3d  *pB){.  if( pA==
1ca40 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
1ca50 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
1ca60 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 2;.  }.  ass
1ca70 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1ca80 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1ca90 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1caa0 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72  uced) );.  asser
1cab0 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1cac0 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f  operty(pB, EP_To
1cad0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1cae0 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70  ed) );.  if( Exp
1caf0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
1cb00 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c   EP_xIsSelect) |
1cb10 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
1cb20 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pB, EP_xIsSele
1cb30 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
1cb40 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 2;.  }.  if( (
1cb50 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
1cb60 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
1cb70 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
1cb80 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
1cb90 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
1cba0 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 32 3b  ->op ) return 2;
1cbb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1cbc0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1cbd0 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
1cbe0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1cbf0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1cc00 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1cc10 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1cc20 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1cc30 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1cc40 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
1cc50 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 29 20  t, pB->x.pList) 
1cc60 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1cc70 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
1cc80 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
1cc90 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
1cca0 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
1ccb0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1ccc0 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e  operty(pA, EP_In
1ccd0 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69  tValue) ){.    i
1cce0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1ccf0 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1cd00 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56  lue) || pA->u.iV
1cd10 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue!=pB->u.iVal
1cd20 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
1cd30 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 2;.    }.  }e
1cd40 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  lse if( pA->op!=
1cd50 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
1cd60 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
1cd70 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1cd80 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56  erty(pB, EP_IntV
1cd90 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70  alue) || NEVER(p
1cda0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20  B->u.zToken==0) 
1cdb0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
1cdc0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1cdd0 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
1cde0 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
1cdf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ce00 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
1ce10 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
1ce20 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21   EP_ExpCollate)!
1ce30 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
1ce40 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 20 72  _ExpCollate) ) r
1ce50 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 28  eturn 1;.  if( (
1ce60 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pA->flags & EP_E
1ce70 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20 26 26  xpCollate)!=0 &&
1ce80 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d 3e   pA->pColl!=pB->
1ce90 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20 32  pColl ) return 2
1cea0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1ceb0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1cec0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
1ced0 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
1cee0 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
1cef0 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
1cf00 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
1cf10 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
1cf20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1cf30 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
1cf40 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
1cf50 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
1cf60 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
1cf70 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
1cf80 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
1cf90 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
1cfa0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
1cfb0 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
1cfc0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
1cfd0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
1cfe0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
1cff0 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
1d000 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1d010 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1d020 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
1d030 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
1d040 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
1d050 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
1d060 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
1d070 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
1d080 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1d090 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1d0a0 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
1d0b0 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
1d0c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1d0d0 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
1d0e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1d0f0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
1d100 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1d110 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
1d120 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
1d130 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
1d140 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
1d150 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1d160 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
1d170 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
1d180 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
1d190 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1d1a0 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72   pA->a[i].sortOr
1d1b0 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  der!=pB->a[i].so
1d1c0 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
1d1d0 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
1d1e0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1d1f0 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20 29  ExprA, pExprB) )
1d200 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1d210 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1d220 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
1d230 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
1d240 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
1d250 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
1d260 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1d270 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
1d280 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1d290 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
1d2a0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
1d2b0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
1d2c0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
1d2d0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
1d2e0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
1d2f0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
1d300 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1d310 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
1d320 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
1d330 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
1d340 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
1d350 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
1d360 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
1d370 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  umn,.       &pIn
1d380 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63  fo->nColumnAlloc
1d390 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
1d3a0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
1d3b0 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
1d3c0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1d3d0 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
1d3e0 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
1d3f0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1d400 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
1d410 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
1d420 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
1d430 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
1d440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
1d450 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
1d460 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
1d470 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
1d480 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
1d490 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
1d4a0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1d4b0 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
1d4c0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
1d4d0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
1d4e0 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
1d4f0 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
1d500 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
1d510 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
1d520 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
1d530 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
1d540 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
1d550 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
1d560 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
1d570 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
1d580 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
1d590 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
1d5a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1d5b0 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
1d5c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1d5d0 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
1d5e0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1d5f0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
1d600 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
1d610 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
1d620 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
1d630 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
1d640 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
1d650 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
1d660 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
1d670 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
1d680 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
1d690 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
1d6a0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
1d6b0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
1d6c0 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
1d6d0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1d6e0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1d6f0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
1d700 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1d710 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1d720 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1d730 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
1d740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d750 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1d760 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
1d770 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1d780 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
1d790 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
1d7a0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
1d7b0 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
1d7c0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
1d7d0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
1d7e0 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
1d7f0 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
1d800 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1d810 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1d820 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
1d830 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1d840 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
1d850 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1d860 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1d870 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1d880 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
1d890 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1d8a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d8b0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1d8c0 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
1d8d0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1d8e0 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
1d8f0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
1d900 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1d910 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1d920 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1d930 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
1d940 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
1d950 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
1d960 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1d970 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
1d980 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
1d990 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1d9a0 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
1d9b0 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
1d9c0 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
1d9d0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
1d9e0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
1d9f0 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
1da00 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
1da10 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1da20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1da30 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
1da40 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
1da50 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
1da60 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
1da70 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
1da80 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1daa0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
1dab0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
1dae0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
1daf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1db00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1db10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1db20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1db30 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
1db40 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
1db50 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1db60 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
1db70 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
1db80 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
1db90 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1dbb0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1dbc0 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
1dbd0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
1dbe0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1dc00 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
1dc10 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1dc20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1dc30 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
1dc40 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1dc50 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
1dc60 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1dc70 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
1dc80 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
1dc90 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
1dca0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1dcb0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1dcd0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
1dce0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
1dcf0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
1dd00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dd10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
1dd20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
1dd30 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
1dd40 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1dd50 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
1dd60 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1dd80 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1dda0 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
1ddb0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1ddc0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1ddd0 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
1dde0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1ddf0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1de00 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1de10 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
1de20 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
1de50 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
1de60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de70 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1de80 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1deb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1def0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1df00 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1df10 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1df20 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
1df30 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
1df40 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
1df50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1df60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1df70 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
1df80 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
1df90 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
1dfa0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
1dfb0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
1dfc0 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
1dfd0 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
1dfe0 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
1dff0 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
1e000 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
1e010 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
1e020 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
1e030 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
1e040 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
1e050 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
1e060 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
1e070 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
1e080 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
1e090 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
1e0a0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1e0b0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
1e0c0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
1e0d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e0e0 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
1e0f0 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
1e100 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
1e110 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
1e120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e130 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
1e140 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
1e150 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
1e160 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
1e170 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
1e180 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
1e190 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1e1a0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
1e1b0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1e1c0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  CTION: {.      /
1e1d0 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74  * The pNC->nDept
1e1e0 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73  h==0 test causes
1e1f0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1e200 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69  ions in subqueri
1e210 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  es.      ** to b
1e220 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20  e ignored */.   
1e230 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70     if( pNC->nDep
1e240 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  th==0 ){.       
1e250 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1e260 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
1e270 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
1e280 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
1e290 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
1e2a0 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
1e2b0 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
1e2c0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
1e2d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e2e0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1e2f0 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
1e300 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
1e310 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1e320 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1e330 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1e340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
1e350 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1e360 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
1e370 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pExpr)==0 ){.   
1e380 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1e390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1e3b0 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
1e3c0 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1e3d0 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
1e3e0 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
1e3f0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
1e400 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
1e410 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1e420 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
1e430 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
1e440 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
1e450 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
1e460 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
1e470 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
1e480 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
1e490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e4a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e4b0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1e4c0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
1e4d0 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
1e4e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1e500 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
1e510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1e520 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
1e530 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1e540 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e550 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e560 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e570 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1e580 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
1e590 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1e5a0 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
1e5b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1e5c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
1e5d0 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74  Token, sqlite3St
1e5e0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
1e5f0 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20  zToken),.       
1e600 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1e610 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
1e620 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1e630 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
1e640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e650 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
1e660 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1e680 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1e690 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1e6b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1e6c0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
1e6d0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
1e6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e6f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e700 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
1e710 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
1e720 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
1e730 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
1e740 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
1e750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e760 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1e770 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1e780 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1e790 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
1e7a0 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
1e7b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1e7c0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
1e7d0 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
1e7e0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
1e7f0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1e800 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1e810 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
1e820 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1e830 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
1e840 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1e850 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1e860 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
1e870 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
1e880 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  lect){.  NameCon
1e890 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
1e8a0 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66  ker->u.pNC;.  if
1e8b0 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
1e8c0 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
1e8d0 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  pth++;.    sqlit
1e8e0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1e8f0 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
1e900 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
1e910 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  -;.    return WR
1e920 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65  C_Prune;.  }else
1e930 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1e940 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
1e950 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1e960 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1e970 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1e980 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1e990 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1e9a0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1e9b0 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1e9c0 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1e9d0 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1e9e0 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1e9f0 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1ea00 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1ea10 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1ea20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ea30 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1ea40 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1ea50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1ea60 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1ea70 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
1ea80 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
1ea90 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1eaa0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1eab0 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1eac0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1ead0 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
1eae0 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
1eaf0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
1eb00 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
1eb10 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1eb20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1eb30 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
1eb40 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
1eb50 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
1eb60 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
1eb70 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
1eb80 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
1eb90 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
1eba0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1ebb0 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
1ebc0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
1ebd0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
1ebe0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
1ebf0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1ec00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1ec10 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
1ec20 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
1ec30 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
1ec40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1ec50 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
1ec60 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
1ec70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
1ec80 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1ec90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1eca0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ecb0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
1ecc0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1ecd0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1ece0 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
1ecf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1ed00 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1ed10 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
1ed20 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
1ed30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
1ed40 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
1ed50 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
1ed60 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
1ed70 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
1ed80 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
1ed90 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
1eda0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1edb0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1edc0 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
1edd0 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
1ede0 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
1edf0 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
1ee00 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
1ee10 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
1ee20 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
1ee30 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
1ee40 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
1ee50 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
1ee60 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
1ee70 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
1ee80 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
1ee90 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
1eea0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
1eeb0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c  then.** the dall
1eec0 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
1eed0 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
1eee0 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
1eef0 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
1ef00 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
1ef10 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
1ef20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1ef30 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
1ef40 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
1ef50 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
1ef60 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
1ef70 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
1ef80 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
1ef90 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
1efa0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1efb0 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
1efc0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1efd0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1efe0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1eff0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1f000 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
1f010 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
1f020 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
1f030 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1f040 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1f050 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1f060 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1f070 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
1f080 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
1f090 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
1f0a0 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
1f0b0 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
1f0c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1f0d0 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
1f0e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
1f0f0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
1f100 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
1f110 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
1f120 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1f130 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
1f140 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
1f150 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
1f160 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
1f170 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61  +n-1) );.    pPa
1f180 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
1f190 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1f1a0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
1f1b0 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
1f1c0 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
1f1d0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1f1e0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1f1f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1f200 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1f210 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1f220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f230 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1f240 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg){.  sqlite3Ex
1f250 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1f260 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
1f270 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
1f280 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1f290 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
1f2a0 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
1f2b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
1f2c0 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
1f2d0 20 7d 0a 7d 0a                                    }.}.