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

Artifact 1a7970a0c5c72a76c6929896ac109f04e194619b:


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 61 64 64 72 46 69 6c  NewItem->addrFil
7410: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
7420: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
7430: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
7440: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
7450: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
7460: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72   pNewItem->isCor
7470: 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  related = pOldIt
7480: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
7490: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
74a0: 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
74b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
74c0: 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  dItem->zIndex);.
74d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f      pNewItem->no
74e0: 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49  tIndexed = pOldI
74f0: 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b  tem->notIndexed;
7500: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7510: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
7520: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
7530: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
7540: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
7550: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
7560: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
7570: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
7580: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
7590: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
75a0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
75b0: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
75c0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
75d0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
75e0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
75f0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
7600: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7610: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
7620: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
7630: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
7640: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
7650: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
7660: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
7670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7680: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
7690: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
76a0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
76b0: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
76c0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
76d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
76e0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
76f0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7700: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7710: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7720: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7730: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
7740: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
7750: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
7760: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7770: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
7780: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
7790: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
77a0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
77b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
77c0: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
77d0: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
77e0: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
77f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
7800: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7810: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7820: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
7830: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
7840: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
7850: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
7860: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7870: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7880: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
7890: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
78a0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
78b0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
78c0: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
78d0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
78e0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
78f0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7900: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
7910: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7920: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7930: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7940: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7950: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
7960: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7970: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
7980: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7990: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
79a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
79b0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
79c0: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
79d0: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
79e0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
79f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7a00: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
7a10: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7a20: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
7a30: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7a40: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
7a50: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
7a60: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
7a70: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
7a80: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
7a90: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
7aa0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7ab0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
7ac0: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
7ad0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
7ae0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
7af0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7b00: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
7b10: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  r, flags);.  pNe
7b20: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
7b30: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7b40: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
7b50: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
7b60: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7b70: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
7b80: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
7b90: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
7ba0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
7bb0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
7bc0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
7bd0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
7be0: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
7bf0: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
7c00: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7c10: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
7c20: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
7c30: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
7c40: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7c50: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
7c60: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
7c70: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
7c80: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
7c90: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
7ca0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7cb0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
7cc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7cd0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
7ce0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
7cf0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
7d00: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
7d10: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
7d20: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
7d30: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
7d40: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
7d50: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
7d60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7d70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
7d80: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
7d90: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
7da0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
7db0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
7dc0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
7dd0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
7de0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
7df0: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
7e00: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
7e10: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
7e20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7e30: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
7e40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7e50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7e60: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
7e70: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
7e80: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
7e90: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
7ea0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
7eb0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
7ec0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7ed0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
7ee0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
7ef0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
7f00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7f10: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
7f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
7f30: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7f40: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
7f50: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
7f60: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
7f70: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
7f80: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
7f90: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
7fa0: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
7fb0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
7fc0: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
7fd0: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
7fe0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
7ff0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
8000: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
8010: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
8020: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
8030: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
8040: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
8050: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
8060: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
8070: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
8080: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
8090: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
80a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
80b0: 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a 65  Size(db, a)/size
80c0: 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  of(a[0]);.  }.  
80d0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
80e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
80f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8100: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8110: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
8120: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
8130: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
8140: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
8150: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
8160: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
8170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
8180: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
8190: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
81a0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
81b0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
81c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
81d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
81e0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
81f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
8200: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
8210: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
8220: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
8230: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
8240: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8250: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
8260: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
8270: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8280: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
8290: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
82a0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
82b0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
82c0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
82d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
82e0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
82f0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
8300: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
8310: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
8320: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8330: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
8340: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8350: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8360: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8370: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8380: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
8390: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
83a0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
83b0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
83c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
83d0: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
83e0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
83f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
8400: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
8410: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
8420: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
8430: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
8440: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8450: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
8460: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
8470: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8480: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
8490: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
84a0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
84b0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
84c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
84d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
84e0: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
84f0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
8500: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
8510: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
8520: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8530: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
8540: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
8550: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
8560: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
8570: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
8580: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
8590: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
85a0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
85b0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
85c0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
85d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
85e0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
85f0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
8600: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8610: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
8620: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8630: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8640: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8650: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8660: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8670: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8680: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8690: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
86a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
86b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
86c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
86d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
86e0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
86f0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8700: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8710: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
8720: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
8730: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
8740: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
8750: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8760: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
8770: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
8780: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
8790: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
87a0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
87b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
87c0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
87d0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
87e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
87f0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
8800: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
8810: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
8820: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
8830: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
8840: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8850: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
8860: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
8870: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8880: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
8890: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
88d0: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
88e0: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
88f0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
8900: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
8910: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
8920: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
8930: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
8940: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
8950: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
8960: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8970: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
8980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
8990: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
89a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
89b0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
89c0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
89d0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
89e0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
89f0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
8a00: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
8a10: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
8a20: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
8a30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
8a40: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
8a50: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
8a60: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
8a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8a80: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8a90: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
8aa0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
8ab0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
8ac0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
8ad0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
8ae0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
8af0: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
8b00: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
8b10: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
8b20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8b30: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8b40: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
8b50: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8b60: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
8b70: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   (pList->nExpr==
8b80: 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  0 && pList->nAll
8b90: 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  oc==0) );.  asse
8ba0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
8bb0: 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  <=pList->nAlloc 
8bc0: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
8bd0: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
8be0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8bf0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8c00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8c10: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
8c20: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8c30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8c40: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
8c50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8c60: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8c70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
8c80: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
8c90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8ca0: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
8cb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
8cc0: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
8cd0: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
8ce0: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
8cf0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8d00: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
8d10: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
8d20: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
8d30: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
8d40: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
8d50: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
8d60: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
8d70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
8d80: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
8d90: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
8da0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
8db0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
8dc0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
8dd0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
8de0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8df0: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
8e00: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8e10: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
8e20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
8e30: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8e40: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
8e50: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
8e60: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
8e70: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
8e80: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
8e90: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
8ea0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
8eb0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
8ec0: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
8ed0: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
8ee0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
8ef0: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
8f00: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
8f10: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
8f20: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
8f30: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
8f40: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
8f50: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
8f60: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8f70: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
8f80: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
8f90: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
8fa0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
8fb0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
8fc0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
8fd0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
8fe0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
8ff0: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
9000: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
9010: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
9020: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20  pWalker->u.i==2 
9030: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
9040: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
9050: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
9060: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
9070: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
9080: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
9090: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
90a0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
90b0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
90c0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
90d0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
90e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
90f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
9100: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9110: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9120: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
9130: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9140: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
9150: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
9160: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
9170: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
9180: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
9190: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
91a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
91b0: 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  rt;.    default:
91c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
91d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
91e0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
91f0: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9200: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9210: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9220: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9230: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
9240: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9250: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
9260: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
9270: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
9280: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
9290: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
92a0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
92b0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
92c0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
92d0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
92e0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
92f0: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
9300: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
9310: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
9320: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
9330: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
9340: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69  alker w;.  w.u.i
9350: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
9360: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
9370: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
9380: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
9390: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
93a0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
93b0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
93c0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
93d0: 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a  urn w.u.i;.}../*
93e0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
93f0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9400: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9410: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9420: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
9430: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9440: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9450: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
9460: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
9470: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
9480: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
9490: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
94a0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
94b0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
94c0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
94d0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
94e0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
94f0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
9500: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9510: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
9520: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9530: 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a  sConst(p, 1);.}.
9540: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9550: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9560: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9570: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9580: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
9590: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
95a0: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
95b0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
95c0: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
95d0: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
95e0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
95f0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9600: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
9610: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
9620: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
9630: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9640: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
9650: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
9660: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
9670: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
9680: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9690: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
96a0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
96b0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
96c0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
96d0: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
96e0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
96f0: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
9700: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
9710: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
9720: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9730: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9740: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9750: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
9760: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
9770: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
9780: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
9790: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
97a0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
97b0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
97c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
97d0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
97e0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
97f0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
9800: 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 2);.}../*.** 
9810: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9820: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
9830: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
9840: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
9850: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
9860: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9870: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
9880: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
9890: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
98a0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
98b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
98c0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
98d0: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
98e0: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
98f0: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
9900: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9910: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
9920: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
9930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9940: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
9950: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
9960: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
9970: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
9980: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
9990: 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
99a0: 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
99b0: 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
99c0: 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
99d0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
99e0: 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
99f0: 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
9a00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
9a10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
9a20: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
9a30: 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
9a40: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9a50: 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
9a60: 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
9a70: 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
9a80: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
9a90: 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
9aa0: 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
9ab0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9ac0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
9ad0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
9ae0: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
9af0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
9b00: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
9b10: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
9b20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9b30: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
9b40: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
9b50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9b60: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9b70: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9b80: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9b90: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9ba0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9bc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
9bd0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
9be0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
9bf0: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
9c00: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
9c10: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
9c20: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
9c30: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
9c40: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
9c50: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
9c60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9c70: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
9c80: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
9c90: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
9ca0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
9cb0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
9cc0: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
9cd0: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
9ce0: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
9cf0: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
9d00: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
9d10: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
9d20: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
9d30: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
9d40: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
9d50: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
9d60: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
9d70: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
9d80: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
9d90: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
9da0: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
9db0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
9dc0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
9dd0: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
9de0: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
9df0: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
9e00: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
9e10: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
9e20: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
9e30: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
9e40: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
9e50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
9e60: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
9e70: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
9e80: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
9e90: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
9ea0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
9eb0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
9ec0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
9ed0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
9ee0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
9ef0: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
9f00: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
9f10: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
9f20: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
9f30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
9f40: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
9f50: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
9f60: 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c  rn 0;.    defaul
9f70: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
9f80: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
9f90: 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49  Generate an OP_I
9fa0: 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f  sNull instructio
9fb0: 6e 20 74 68 61 74 20 74 65 73 74 73 20 72 65 67  n that tests reg
9fc0: 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a  ister iReg and j
9fd0: 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  umps.** to locat
9fe0: 69 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68 65  ion iDest if the
9ff0: 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69   value in iReg i
a000: 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c  s NULL.  The val
a010: 75 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77  ue in iReg .** w
a020: 61 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70  as computed by p
a030: 45 78 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e  Expr.  If we can
a040: 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61   look at pExpr a
a050: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61  t compile-time a
a060: 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  nd.** determine 
a070: 74 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65  that it can neve
a080: 72 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c  r generate a NUL
a090: 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49  L, then the OP_I
a0a0: 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a  sNull operation.
a0b0: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
a0c0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
a0d0: 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
a0e0: 4a 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c  Jump(.  Vdbe *v,
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a100: 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
a110: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
a120: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
a130: 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65  r,  /* Only gene
a140: 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69  rate OP_IsNull i
a150: 66 20 74 68 69 73 20 65 78 70 72 20 63 61 6e 20  f this expr can 
a160: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
a170: 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 20 20   iReg,          
a180: 20 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c   /* Test the val
a190: 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
a1a0: 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ter for NULL */.
a1b0: 20 20 69 6e 74 20 69 44 65 73 74 20 20 20 20 20    int iDest     
a1c0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
a1d0: 72 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  re if the value 
a1e0: 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  is null */.){.  
a1f0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
a200: 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20  anBeNull(pExpr) 
a210: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a220: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a230: 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65  sNull, iReg, iDe
a240: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
a250: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
a260: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a270: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
a280: 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
a290: 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
a2a0: 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
a2b0: 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
a2c0: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
a2d0: 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
a2e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a2f0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
a300: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
a310: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
a320: 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
a330: 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
a340: 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
a350: 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
a360: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
a370: 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
a380: 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
a390: 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
a3a0: 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
a3b0: 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
a3c0: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
a3d0: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
a3e0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
a3f0: 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
a400: 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
a410: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20  LITE_AFF_NONE ) 
a420: 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
a430: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
a440: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
a450: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
a460: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
a470: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
a480: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
a490: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
a4a0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
a4b0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
a4c0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a4d0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a4e0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
a4f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a500: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
a510: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
a520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
a530: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
a540: 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
a550: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
a560: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a570: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
a580: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
a590: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
a5a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
a5b0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
a5c0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
a5d0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
a5e0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a5f0: 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
a600: 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
a610: 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
a620: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
a630: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
a640: 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
a650: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
a660: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
a670: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
a680: 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
a690: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
a6a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a6b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a6c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
a6d0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
a6e0: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
a6f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
a700: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
a710: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
a720: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
a730: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
a740: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
a750: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a760: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
a770: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
a780: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a790: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
a7a0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
a7b0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
a7c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a7d0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62  rue if we are ab
a7e0: 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65  le to the IN ope
a7f0: 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  rator optimizati
a800: 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79  on on a.** query
a810: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
a820: 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53  **       x IN (S
a830: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
a840: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
a850: 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61  T... clause is a
a860: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
a870: 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  he parameter to 
a880: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  this.** routine.
a890: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63  .**.** The Selec
a8a0: 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
a8b0: 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  in has already b
a8c0: 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64  een preprocessed
a8d0: 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72   and no.** error
a8e0: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e  s have been foun
a8f0: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
a900: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a910: 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  RY.static int is
a920: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
a930: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
a940: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
a950: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
a960: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
a970: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
a980: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
a990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69             /* ri
a9a0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
a9b0: 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f   IN is SELECT */
a9c0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
a9d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
a9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
a9f0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
aa00: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
aa10: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
aa20: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
aa30: 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
aa40: 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
aa50: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
aa60: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
aa70: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
aa80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
aa90: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
aaa0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
aab0: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
aac0: 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
aad0: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
aae0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
aaf0: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
ab00: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
ab10: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
ab20: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
ab30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
ab40: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
ab50: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
ab60: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
ab70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ab80: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
ab90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73   clause */.  ass
aba0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
abb0: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
abc0: 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20      /* No LIMIT 
abd0: 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20  means no OFFSET 
abe0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
abf0: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ac10: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
ac20: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
ac30: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
ac40: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
ac50: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
ac60: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
ac70: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
ac80: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
ac90: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
aca0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
acb0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
acc0: 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
acd0: 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
ace0: 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
acf0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
ad00: 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d   if( NEVER(pTab=
ad10: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
ad20: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
ad30: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
ad40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
ad50: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
ad60: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
ad70: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
ad80: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
ad90: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
ada0: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
adb0: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
adc0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
add0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
ade0: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
adf0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
ae00: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
ae10: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20  lt set */.  if( 
ae20: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
ae30: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
ae40: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  N ) return 0; /*
ae50: 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   Result is a col
ae60: 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  umn */.  return 
ae70: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
ae80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
ae90: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ERY */../*.** Th
aea0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
aeb0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
aec0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
aed0: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
aee0: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
aef0: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
af00: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
af10: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
af20: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
af30: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
af40: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
af50: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
af60: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
af70: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
af80: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
af90: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
afa0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72  index of the cur
afb0: 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  sor opened on th
afc0: 65 20 62 2d 74 72 65 65 20 28 64 61 74 61 62 61  e b-tree (databa
afd0: 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61  se table, databa
afe0: 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20  se index .** or 
aff0: 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20  ephermal table) 
b000: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d  is stored in pX-
b010: 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74  >iTable before t
b020: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b030: 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74  urns..** The ret
b040: 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
b050: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
b060: 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
b070: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
b080: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
b090: 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65  NDEX_ROWID - The
b0a0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
b0b0: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
b0c0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
b0d0: 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68  INDEX_INDEX - Th
b0e0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
b0f0: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
b100: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  e index..**   IN
b110: 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54  _INDEX_EPH -   T
b120: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
b130: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
b140: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
b150: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b160: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
b170: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
b180: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
b190: 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20 6f 6e  ng b-tree may on
b1a0: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ly be used if th
b1b0: 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
b1c0: 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72  he simple.** for
b1d0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  m:.**.**     SEL
b1e0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
b1f0: 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
b200: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b210: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
b220: 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  , then the b-tre
b230: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
b240: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
b250: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
b260: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
b270: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
b280: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
b290: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
b2a0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
b2b0: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
b2c0: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
b2d0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
b2e0: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
b2f0: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
b300: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
b310: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
b320: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f   has a UNIQUE co
b330: 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51  nstraint or UNIQ
b340: 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  UE index..**.** 
b350: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b360: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
b370: 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62  ot 0, then the b
b380: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
b390: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
b3a0: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
b3b0: 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ests. In this ca
b3c0: 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  se an epheremal 
b3d0: 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
b3e0: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
b3f0: 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54  olumn> is an INT
b400: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b410: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   or an index can
b420: 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69   .** be found wi
b430: 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69  th <column> as i
b440: 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ts left-most col
b450: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  umn..**.** When 
b460: 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
b470: 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
b480: 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
b490: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
b4a0: 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  ion.** needs to 
b4b0: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
b4c0: 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72  not the structur
b4d0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51  e contains an SQ
b4e0: 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65  L NULL .** value
b4f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72   in order to cor
b500: 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20  rectly evaluate 
b510: 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65  expressions like
b520: 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a   "X IN (Y, Z)"..
b530: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
b540: 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
b550: 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
b560: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
b570: 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
b580: 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
b590: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
b5a0: 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
b5b0: 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
b5c0: 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e  ** to *prNotFoun
b5d0: 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  d. If there is n
b5e0: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
b5f0: 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
b600: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
b610: 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75  , then *prNotFou
b620: 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  nd is left uncha
b630: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
b640: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
b650: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
b660: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
b670: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74  n *prNotFound, t
b680: 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69  hen.** its initi
b690: 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  al value is NULL
b6a0: 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20  .  If the (...) 
b6b0: 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20  does not remain 
b6c0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
b6d0: 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20  the duration of 
b6e0: 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20  the query (i.e. 
b6f0: 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68 69  the SELECT withi
b700: 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69  n the (...).** i
b710: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
b720: 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
b730: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
b740: 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65  llocated registe
b750: 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f  r is.** reset to
b760: 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20   NULL each time 
b770: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
b780: 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f  rerun. This allo
b790: 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  ws the.** caller
b7a0: 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64   to use vdbe cod
b7b0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
b7c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b7d0: 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73  *.**   if( regis
b7e0: 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20  ter==NULL ){.** 
b7f0: 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c      has_null = <
b800: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
b810: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
b820: 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67  null>.**     reg
b830: 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d  ister = 1.**   }
b840: 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  .**.** in order 
b850: 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67  to avoid running
b860: 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61   the <test if da
b870: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
b880: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74  tains null>.** t
b890: 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  est more often t
b8a0: 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  han is necessary
b8b0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b8c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b8d0: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
b8e0: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
b8f0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
b900: 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e  , int *prNotFoun
b910: 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  d){.  Select *p;
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b940: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
b950: 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
b960: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
b970: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b990: 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
b9a0: 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
b9b0: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
b9c0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
b9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
b9e0: 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
b9f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
ba00: 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e  tBeUnique = (prN
ba10: 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f  otFound==0);   /
ba20: 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
ba30: 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
ba40: 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
ba50: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f  p==TK_IN );..  /
ba60: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
ba70: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
ba80: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
ba90: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
baa0: 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
bab0: 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
bac0: 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
bad0: 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
bae0: 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
baf0: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45  e..  */.  p = (E
bb00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
bb10: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
bb20: 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   ? pX->x.pSelect
bb30: 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57   : 0);.  if( ALW
bb40: 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  AYS(pParse->nErr
bb50: 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64  ==0) && isCandid
bb60: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
bb70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
bb80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bba0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
bbb0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  ion */.    Expr 
bbc0: 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69  *pExpr = p->pELi
bbd0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 20  st->a[0].pExpr; 
bbe0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
bbf0: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
bc00: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
bc10: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  ->iColumn;      
bc20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
bc30: 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d  of column <colum
bc40: 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a  n> */.    Vdbe *
bc50: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
bc60: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
bc70: 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
bc80: 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
bc90: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
bca0: 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
bcb0: 30 5d 2e 70 54 61 62 3b 20 20 20 20 20 20 2f 2a  0].pTab;      /*
bcc0: 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
bcd0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd00: 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
bd10: 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 0a 20 20  r pTab */.   .  
bd20: 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
bd30: 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64  VerifyCookie and
bd40: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
bd50: 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
bd60: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
bd70: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
bd80: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
bd90: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
bda0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
bdb0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
bdc0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
bdd0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
bde0: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
bdf0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  ->zName);..    /
be00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
be10: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
be20: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
be30: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
be40: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
be50: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
be60: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
be70: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
be80: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
be90: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
bea0: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
beb0: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
bec0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
bed0: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
bee0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
bef0: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
bf00: 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20  ..      iAddr = 
bf10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf20: 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 69 4d  1(v, OP_Once, iM
bf30: 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  em);..      sqli
bf40: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
bf50: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
bf60: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
bf70: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
bf80: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
bf90: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
bfa0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bfb0: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
bfc0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
bfd0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bff0: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
c000: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
c010: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
c020: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
c030: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
c040: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
c050: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65  .      ** be use
c060: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
c070: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d  temp-table, it m
c080: 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61  ust be ordered a
c090: 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a  ccording.      *
c0a0: 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74  * to this collat
c0b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a  ion sequence.  *
c0c0: 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
c0d0: 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
c0e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
c0f0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
c100: 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a  pLeft, pExpr);..
c110: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
c120: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
c130: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
c140: 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  ed to perform th
c150: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  e .      ** comp
c160: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
c170: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
c180: 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ty of the column
c190: 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
c1a0: 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   is not, it is n
c1b0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
c1c0: 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20  se any index..  
c1d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
c1e0: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
c1f0: 6f 6e 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a  onAffinity(pX);.
c200: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
c210: 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61  ty_ok = (pTab->a
c220: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
c230: 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51  ty==aff||aff==SQ
c240: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
c250: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
c260: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c270: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
c280: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
c290: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c2a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
c2b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
c2c0: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
c2d0: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
c2e0: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
c2f0: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
c300: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
c310: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
c320: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
c330: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
c340: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
c350: 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20  OE_None)).      
c360: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
c370: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
c380: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
c390: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
c3a0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
c3b0: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
c3c0: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
c3d0: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
c3e0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
c3f0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41  x);.          iA
c400: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c410: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
c420: 63 65 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20  ce, iMem);.  .  
c430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c440: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
c450: 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
c460: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c  pIdx->tnum, iDb,
c470: 0a 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 20 20                  
c490: 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f  pKey,P4_KEYINFO_
c4a0: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
c4b0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c4c0: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
c4d0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
c4e0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
c4f0: 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20  DEX_INDEX;..    
c500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c510: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
c520: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
c530: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26  f( prNotFound &&
c540: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
c550: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l].notNull ){.  
c560: 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74            *prNot
c570: 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  Found = ++pParse
c580: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
c590: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
c5a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c5b0: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
c5c0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
c5d0: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69  not found an exi
c5e0: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
c5f0: 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
c600: 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
c610: 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
c620: 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
c630: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
c640: 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
c650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62  .    */.    doub
c660: 6c 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  le savedNQueryLo
c670: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
c680: 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
c690: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
c6a0: 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
c6b0: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
c6c0: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
c6d0: 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46  ){.      *prNotF
c6e0: 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e  ound = rMayHaveN
c6f0: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
c700: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nMem;.    }else{
c710: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c720: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
c730: 6f 6f 70 3e 28 64 6f 75 62 6c 65 29 31 20 29 3b  oop>(double)1 );
c740: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c750: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75  QueryLoop = (dou
c760: 62 6c 65 29 31 3b 0a 20 20 20 20 20 20 69 66 28  ble)1;.      if(
c770: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
c780: 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61  umn<0 && !ExprHa
c790: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c  sAnyProperty(pX,
c7a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
c7b0: 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
c7c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
c7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c7e0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
c7f0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
c800: 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
c810: 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
c820: 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
c830: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
c840: 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
c850: 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
c860: 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
c870: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
c880: 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
c890: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
c8a0: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
c8b0: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
c8c0: 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
c8d0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
c8e0: 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
c8f0: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
c900: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
c910: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
c920: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
c930: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
c940: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
c950: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
c960: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
c970: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
c980: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
c990: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
c9a0: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
c9b0: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
c9c0: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
c9d0: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
c9e0: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
c9f0: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
ca00: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
ca10: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
ca20: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
ca30: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
ca40: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
ca50: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
ca60: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
ca70: 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
ca80: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
ca90: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
caa0: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
cab0: 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
cac0: 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
cad0: 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
cae0: 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
caf0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
cb00: 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
cb10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
cb20: 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
cb30: 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
cb40: 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
cb50: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
cb60: 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
cb70: 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
cb80: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
cb90: 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
cba0: 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
cbb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
cbc0: 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
cbd0: 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
cbe0: 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
cbf0: 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
cc00: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
cc10: 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
cc20: 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
cc30: 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
cc40: 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74  * Furthermore, t
cc50: 68 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48  he IN is in a WH
cc60: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74  ERE clause and t
cc70: 68 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61  hat we really wa
cc80: 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65  nt.** to iterate
cc90: 20 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f 66   over the RHS of
cca0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
ccb0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69   in order to qui
ccc0: 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61  ckly locate.** a
ccd0: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ll corresponding
cce0: 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20   LHS elements.  
ccf0: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
cd00: 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
cd10: 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ize.** the regis
cd20: 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
cd30: 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c  yHaveNull to NUL
cd40: 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
cd50: 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a  ines will take.*
cd60: 2a 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  * care of changi
cd70: 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
cd80: 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
cd90: 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
cda0: 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
cdb0: 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
cdc0: 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20  l is zero, that 
cdd0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
cde0: 75 62 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  ubquery is being
cdf0: 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d   used.** for mem
ce00: 62 65 72 73 68 69 70 20 74 65 73 74 69 6e 67 20  bership testing 
ce10: 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20  only.  There is 
ce20: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69  no need to initi
ce30: 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67  alize any.** reg
ce40: 69 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61  isters to indica
ce50: 74 65 20 74 68 65 20 70 72 65 73 65 6e 73 65 20  te the presense 
ce60: 6f 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55  or absence of NU
ce70: 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a  LLs on the RHS..
ce80: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
ce90: 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
cea0: 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
ceb0: 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
cec0: 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
ced0: 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65  ult.  For IN ope
cee0: 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
cef0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
cf00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
cf10: 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  s 0..*/.#ifndef 
cf20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cf30: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
cf40: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
cf50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cf70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cf80: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
cf90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cfa0: 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
cfb0: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
cfc0: 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65  /.  int rMayHave
cfd0: 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52  Null,       /* R
cfe0: 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
cff0: 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
d000: 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
d010: 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d030: 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
d040: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
d050: 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
d060: 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31  nt testAddr = -1
d070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d080: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
d090: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
d0a0: 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
d0b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0d0: 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
d0e0: 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
d0f0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d100: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d110: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
d120: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
d130: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
d140: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
d150: 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
d160: 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69  must be run in i
d170: 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72  ts entirety ever
d180: 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  y time it is enc
d190: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66  ountered.  ** if
d1a0: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
d1b0: 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
d1c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
d1d0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
d1e0: 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
d1f0: 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
d200: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
d210: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
d220: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d230: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
d240: 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
d250: 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
d260: 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
d270: 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
d280: 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
d290: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
d2a0: 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
d2b0: 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
d2c0: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
d2d0: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
d2e0: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
d2f0: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
d300: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
d310: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
d320: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
d330: 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65  lect) && !pParse
d340: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
d350: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b  .    int mem = +
d360: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
d370: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71     testAddr = sq
d380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d390: 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 6d 65 6d 29  v, OP_Once, mem)
d3a0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
d3b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
d3c0: 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  IN.  if( pParse-
d3d0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
d3e0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
d3f0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
d400: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
d410: 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
d420: 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
d430: 74 65 73 74 41 64 64 72 3e 3d 30 3f 22 22 3a 22  testAddr>=0?"":"
d440: 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
d450: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
d460: 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
d470: 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65 2d 3e  CALAR", pParse->
d480: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
d490: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
d4a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
d4b0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
d4c0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
d4d0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
d4e0: 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
d4f0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
d500: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
d510: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
d520: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d540: 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
d550: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
d560: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b  .      KeyInfo k
d570: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
d580: 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
d590: 72 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  r the generated 
d5a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  table */.      i
d5b0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
d5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d5d0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
d5e0: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
d5f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
d600: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
d610: 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
d620: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
d630: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  operator */..   
d640: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
d650: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
d660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d670: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d680: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20  rMayHaveNull);. 
d690: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66       }..      af
d6a0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
d6b0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
d6c0: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
d6d0: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
d6e0: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
d6f0: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
d700: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
d710: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
d720: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
d730: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
d740: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
d750: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
d760: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
d770: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
d780: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
d790: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
d7a0: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
d7b0: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
d7c0: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
d7d0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
d7e0: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
d7f0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
d800: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
d810: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
d820: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
d830: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
d840: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
d850: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
d860: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
d870: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
d880: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
d890: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
d8a0: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
d8b0: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
d8c0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
d8d0: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
d8e0: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
d8f0: 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
d900: 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
d910: 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
d920: 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
d930: 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
d940: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
d950: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
d960: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
d970: 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
d980: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
d990: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
d9a0: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
d9b0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
d9c0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d9d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d9e0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
d9f0: 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f  r->iTable, !isRo
da00: 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
da10: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 3d 3d 30 20  rMayHaveNull==0 
da20: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
da30: 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
da40: 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 20  NORDERED);.     
da50: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
da60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
da70: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
da80: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
da90: 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
daa0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
dab0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
dac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
dad0: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
dae0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
daf0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
db00: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
db10: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
db20: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
db30: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
db40: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
db50: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
db60: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
db70: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
db80: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
db90: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
dba0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
dbb0: 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
dbc0: 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
dbd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dbe0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
dbf0: 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
dc00: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
dc10: 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66          dest.aff
dc20: 69 6e 69 74 79 20 3d 20 28 75 38 29 61 66 66 69  inity = (u8)affi
dc30: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73  nity;.        as
dc40: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
dc50: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
dc60: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
dc70: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
dc80: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69  ->x.pSelect->iLi
dc90: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
dca0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
dcb0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
dcc0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64 65  ->x.pSelect, &de
dcd0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
dce0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
dcf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
dd00: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
dd10: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
dd20: 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
dd30: 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26 20  YS(pEList!=0 && 
dd40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29  pEList->nExpr>0)
dd50: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
dd60: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
dd70: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
dd80: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
dd90: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
dda0: 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft,.            
ddb0: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
ddc0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
ddd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dde0: 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
ddf0: 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  .pList!=0) ){.  
de00: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
de10: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
de20: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
de30: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
de40: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
de50: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
de60: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
de70: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
de80: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
de90: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
dea0: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
deb0: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
dec0: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
ded0: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
dee0: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
def0: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
df00: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
df10: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
df20: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
df30: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
df40: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
df50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
df60: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
df70: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
df80: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
df90: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
dfa0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
dfb0: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
dfc0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
dfd0: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
dfe0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
dff0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
e000: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e010: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
e020: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
e030: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
e040: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
e050: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
e060: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
e070: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
e080: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
e090: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
e0a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
e0b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
e0c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
e0d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
e0e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e0f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
e100: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
e110: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
e120: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
e130: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
e140: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
e150: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
e160: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
e170: 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
e180: 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
e190: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
e1a0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
e1b0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
e1c0: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
e1d0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
e1e0: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
e1f0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
e200: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
e210: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
e220: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
e230: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
e240: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
e250: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
e260: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
e270: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
e280: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
e290: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
e2a0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
e2b0: 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20 26  f( testAddr>=0 &
e2c0: 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
e2d0: 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
e2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
e2f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
e300: 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72  Noop(v, testAddr
e310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
e320: 65 73 74 41 64 64 72 20 3d 20 2d 31 3b 0a 20 20  estAddr = -1;.  
e330: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
e340: 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
e350: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e360: 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
e370: 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
e380: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
e390: 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71  f( isRowid && sq
e3a0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
e3b0: 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49  er(pE2, &iValToI
e3c0: 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ns) ){.         
e3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e3e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
e3f0: 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  tInt, pExpr->iTa
e400: 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49  ble, r2, iValToI
e410: 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ns);.          }
e420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e430: 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
e440: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
e450: 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
e460: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
e470: 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
e480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e490: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e4a0: 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20  MustBeInt, r3,. 
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
e4d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e4e0: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
e4f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e500: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e510: 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72  OP_Insert, pExpr
e520: 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
e530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
e540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e560: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
e570: 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72  Record, r3, 1, r
e580: 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
e590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e5a0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
e5b0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
e5c0: 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20  Parse, r3, 1);. 
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e5f0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
e600: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
e610: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
e620: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
e630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e640: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
e650: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
e660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e670: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
e680: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
e690: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e6a0: 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  !isRowid ){.    
e6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e6c0: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
e6d0: 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66   (void *)&keyInf
e6e0: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
e6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
e710: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
e720: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
e730: 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
e740: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
e750: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
e760: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
e770: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e780: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
e790: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
e7a0: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
e7b0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
e7c0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
e7d0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
e7e0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
e7f0: 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69  lumn.  If this i
e800: 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
e810: 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  te.      ** an i
e820: 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78  nteger 0 (not ex
e830: 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73  ists) or 1 (exis
e840: 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  ts) into a memor
e850: 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  y cell.      ** 
e860: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74 20  and record that 
e870: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
e880: 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
e890: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
e8a0: 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sel;            
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e8d0: 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
e8e0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
e8f0: 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
e900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
e910: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45   to deal with SE
e920: 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  LECt result */..
e930: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e940: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
e950: 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
e960: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e970: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
e980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
e990: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
e9a0: 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
e9b0: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20  =TK_SELECT );.. 
e9c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
e9d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
e9e0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
e9f0: 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  ) );.      pSel 
ea00: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
ea10: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
ea20: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
ea30: 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
ea40: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
ea50: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
ea60: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
ea70: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
ea80: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
ea90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eaa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
eab0: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
eac0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
ead0: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
eae0: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
eaf0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
eb00: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
eb10: 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
eb20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
eb40: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
eb50: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
eb60: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
eb70: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
eb80: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
eb90: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
eba0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
ebb0: 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
ebc0: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
ebd0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
ebe0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
ebf0: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
ec00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f     &sqlite3IntTo
ec30: 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20  kens[1]);.      
ec40: 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
ec50: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
ec60: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
ec70: 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
ec80: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
ec90: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
eca0: 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 50    rReg = dest.iP
ecb0: 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53  arm;.      ExprS
ecc0: 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
ecd0: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
ece0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
ecf0: 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20  if( testAddr>=0 
ed00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ed10: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
ed20: 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73  stAddr);.  }.  s
ed30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
ed40: 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a  op(pParse, 1);..
ed50: 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
ed60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ed70: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
ed80: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ed90: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
eda0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
edb0: 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
edc0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
edd0: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
ede0: 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
edf0: 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
ee00: 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
ee10: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
ee20: 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
ee30: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  lar expression. 
ee40: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
ee50: 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73  side (RHS).** is
ee60: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
ee70: 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73  o or more values
ee80: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
ee90: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
eea0: 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61   LHS is.** conta
eeb0: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
eec0: 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20  RHS.  The value 
eed0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
eee0: 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55  n is unknown (NU
eef0: 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48  LL).** if the LH
ef00: 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  S is NULL or if 
ef10: 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63  the LHS is not c
ef20: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
ef30: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a  the RHS and the.
ef40: 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  ** RHS contains 
ef50: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
ef60: 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   values..**.** T
ef70: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
ef80: 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20  rates code will 
ef90: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61  jump to destIfFa
efa0: 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
efb0: 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
efc0: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
efd0: 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
efe0: 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
eff0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
f000: 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
f010: 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
f020: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
f030: 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
f040: 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
f050: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
f060: 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
f070: 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
f080: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
f090: 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
f0a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
f0b0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
f0c0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
f0d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
f0e0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
f0f0: 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
f100: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
f110: 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
f120: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
f130: 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
f140: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
f150: 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
f160: 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
f170: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
f180: 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
f190: 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
f1a0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
f1b0: 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
f1c0: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
f1d0: 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
f1e0: 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
f1f0: 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61  lues */.  char a
f200: 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
f210: 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
f220: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
f230: 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
f240: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
f250: 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
f260: 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
f270: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
f280: 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
f290: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f2b0: 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
f2c0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
f2d0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
f2e0: 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68   RHS.   After th
f2f0: 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62  is step, the tab
f300: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20  le with cursor. 
f310: 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
f320: 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20  e will contains 
f330: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
f340: 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
f350: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
f360: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
f370: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
f380: 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
f390: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
f3a0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
f3b0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
f3c0: 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
f3d0: 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
f3e0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
f3f0: 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
f400: 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
f410: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
f420: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
f430: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
f440: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
f450: 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
f460: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
f470: 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
f480: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
f490: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
f4a0: 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
f4b0: 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
f4c0: 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
f4d0: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
f4e0: 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
f4f0: 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
f500: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
f510: 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
f520: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
f530: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
f540: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
f550: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f560: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
f570: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
f580: 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
f590: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53  .  /* If the LHS
f5a0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
f5b0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
f5c0: 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
f5d0: 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  L depending.  **
f5e0: 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20   on whether the 
f5f0: 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20  RHS is empty or 
f600: 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
f610: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  y..  */.  if( de
f620: 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
f630: 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20  False ){.    /* 
f640: 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
f650: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
f660: 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64  re the false and
f670: 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61   NULL outcomes a
f680: 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
f690: 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  me. */.    sqlit
f6a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f6b0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64  OP_IsNull, r1, d
f6c0: 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  estIfNull);.  }e
f6d0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  lse{.    int add
f6e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
f6f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
f700: 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73  Null, r1);.    s
f710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f720: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
f730: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
f740: 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
f750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f760: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
f770: 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
f780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f790: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
f7a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
f7b0: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
f7c0: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  D ){.    /* In t
f7d0: 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
f7e0: 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
f7f0: 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20  f table b-tree. 
f800: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
f810: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f820: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c  P_MustBeInt, r1,
f830: 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
f840: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f850: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
f860: 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
f870: 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
f880: 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , r1);.  }else{.
f890: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
f8a0: 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
f8b0: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
f8c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
f8d0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f8e0: 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31   OP_Affinity, r1
f8f0: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
f900: 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  y, 1);..    /* I
f910: 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
f920: 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
f930: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
f940: 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
f950: 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70  "x IN (...)" exp
f960: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
f970: 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c  either 0 or NULL
f980: 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20  . If the set.   
f990: 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
f9a0: 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
f9b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
f9c0: 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20  0. If the set . 
f9d0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f     ** contains o
f9e0: 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
f9f0: 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
fa00: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
fa10: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
fa20: 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20   is also NULL.. 
fa30: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52     */.    if( rR
fa40: 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20  hsHasNull==0 || 
fa50: 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
fa60: 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
fa70: 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
fa80: 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e  runs if it is kn
fa90: 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  own at compile t
faa0: 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53  ime that the RHS
fab0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  .      ** cannot
fac0: 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
fad0: 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
fae0: 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
faf0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22  .      ** of a "
fb00: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
fb10: 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  aint in the data
fb20: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
fb30: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
fb40: 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61  lso run this bra
fb50: 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65  nch if NULL is e
fb60: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c  quivalent to FAL
fb70: 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  SE.      ** for 
fb80: 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  this particular 
fb90: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
fba0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
fbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
fbc0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
fbd0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
fbe0: 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c  destIfFalse, r1,
fbf0: 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b   1);..    }else{
fc00: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
fc10: 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48  s branch, the RH
fc20: 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68  S of the IN migh
fc30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
fc40: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
fc50: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20  e presence of a 
fc60: 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20  NULL on the RHS 
fc70: 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e  makes a differen
fc80: 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ce in the.      
fc90: 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20  ** outcome..    
fca0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
fcb0: 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20  1, j2, j3;..    
fcc0: 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
fcd0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
fce0: 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  HS is contained 
fcf0: 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
fd00: 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  so,.      ** the
fd10: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
fd20: 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
fd30: 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  HS does not matt
fd40: 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20  er, so jump.    
fd50: 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
fd60: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   the code that f
fd70: 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f  ollows..      */
fd80: 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
fd90: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
fda0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
fdb0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
fdc0: 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f  r1, 1);..      /
fdd0: 2a 20 48 65 72 65 20 77 65 20 62 65 67 69 6e 20  * Here we begin 
fde0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  generating code 
fdf0: 74 68 61 74 20 72 75 6e 73 20 69 66 20 74 68 65  that runs if the
fe00: 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20   LHS is not.    
fe10: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77    ** contained w
fe20: 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
fe30: 47 65 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f  Generate additio
fe40: 6e 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20  nal code that.  
fe50: 20 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65      ** tests the
fe60: 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20   RHS for NULLs. 
fe70: 20 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74   If the RHS cont
fe80: 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e  ains a NULL then
fe90: 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
fea0: 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
feb0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e  f there are no N
fec0: 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20  ULLs in the RHS 
fed0: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75  then.      ** ju
fee0: 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  mp to destIfFals
fef0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ff00: 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
ff10: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
ff20: 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
ff30: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d  ull);.      j3 =
ff40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ff50: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
ff60: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
ff70: 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
ff80: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
ff90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ffa0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
ffb0: 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20   rRhsHasNull);. 
ffc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ffd0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b  JumpHere(v, j3);
ffe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fff0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
10000 64 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75  ddImm, rRhsHasNu
10010 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ll, 1);.      sq
10020 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10030 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20  e(v, j2);..     
10040 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
10050 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 72 67  appropriate targ
10060 65 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  et depending on 
10070 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
10080 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20       ** the RHS 
10090 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a  contains a NULL.
100a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
100b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
100c0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48  (v, OP_If, rRhsH
100d0 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
100e0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
100f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10100 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
10110 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20  IfFalse);..     
10120 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64   /* The OP_Found
10130 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
10140 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73  his branch jumps
10150 20 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c   here when true,
10160 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69   .      ** causi
10170 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49  ng the overall I
10180 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  N expression eva
10190 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20  luation to fall 
101a0 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a  through..      *
101b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
101c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
101d0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
101e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
101f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10200 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
10210 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
10220 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65   1);.  VdbeComme
10230 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
10240 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpr"));.}.#endif
10250 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10260 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
10270 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
10280 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
10290 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
102a0 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
102b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
102c0 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
102d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
102e0 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
102f0 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
10300 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
10310 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
10320 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
10330 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10340 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
10350 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
10360 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
10370 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
10380 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
10390 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
103a0 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
103b0 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
103c0 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
103d0 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
103e0 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
103f0 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
10400 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
10410 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
10420 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
10430 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
10440 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
10450 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
10460 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
10470 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
10480 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
10490 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
104a0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
104b0 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
104c0 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
104d0 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
104e0 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  ble value;.    c
104f0 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c  har *zV;.    sql
10500 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
10510 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
10520 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
10530 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
10540 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
10550 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
10560 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
10570 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
10580 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
10590 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
105a0 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70  ue;.    zV = dup
105b0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
105c0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71  )&value);.    sq
105d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
105e0 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
105f0 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52  Mem, 0, zV, P4_R
10600 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
10610 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
10620 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
10630 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
10640 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
10650 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
10660 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
10670 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
10680 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
10690 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
106a0 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
106b0 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
106c0 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
106d0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
106e0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
106f0 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
10700 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
10710 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10720 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
10730 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
10740 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
10750 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
10760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
10770 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
10780 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
10790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
107a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
107b0 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
107c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
107d0 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
107e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
107f0 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
10800 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
10810 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
10820 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34   = sqlite3Atoi64
10830 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
10840 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
10850 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
10860 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
10870 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
10880 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
10890 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  V;.      if( neg
108a0 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
108b0 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
108c0 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
108d0 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  }.      zV = dup
108e0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
108f0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
10900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10910 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
10920 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
10930 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
10940 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
10950 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
10960 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
10970 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10980 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
10990 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
109a0 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
109b0 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  "", z);.#else.  
109c0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
109d0 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
109e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
109f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
10a00 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
10a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10a20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
10a30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10a40 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
10a50 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
10a60 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
10a70 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
10a80 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
10a90 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
10aa0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
10ab0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
10ac0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
10ad0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
10ae0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
10af0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
10b00 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
10b10 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
10b20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
10b30 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
10b40 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
10b50 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
10b60 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
10b70 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
10b80 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
10b90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10ba0 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
10bb0 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
10bc0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
10bd0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
10be0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
10bf0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
10c00 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
10c10 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
10c20 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
10c30 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
10c40 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
10c50 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
10c60 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
10c70 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
10c80 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
10c90 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
10ca0 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
10cb0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
10cc0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
10cd0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
10ce0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
10cf0 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
10d00 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
10d10 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
10d20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
10d30 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
10d40 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
10d50 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
10d60 43 6f 6c 75 6d 6e 43 61 63 68 65 20 29 20 72 65  ColumnCache ) re
10d70 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
10d80 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
10d90 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
10da0 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
10db0 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
10dc0 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
10dd0 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
10de0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
10df0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
10e00 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
10e10 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
10e20 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
10e30 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
10e40 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
10e50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
10e60 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
10e70 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
10e80 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
10e90 0a 23 69 66 20 30 20 2f 2a 20 54 68 69 73 20 63  .#if 0 /* This c
10ea0 6f 64 65 20 77 6f 6c 64 20 72 65 6d 6f 76 65 20  ode wold remove 
10eb0 74 68 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  the entry from t
10ec0 68 65 20 63 61 63 68 65 20 69 66 20 69 74 20 65  he cache if it e
10ed0 78 69 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 66  xisted */.    if
10ee0 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
10ef0 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20  iTable==iTab && 
10f00 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
10f10 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
10f20 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
10f30 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
10f40 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
10f50 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
10f60 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
10f70 67 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  g;.      p->lru 
10f80 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
10f90 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
10fa0 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  urn;.    }.#endi
10fb0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
10fc0 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  >iReg==0 || p->i
10fd0 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70  Table!=iTab || p
10fe0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20  ->iColumn!=iCol 
10ff0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
11000 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74   /* Find an empt
11010 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61  y slot and repla
11020 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69  ce it */.  for(i
11030 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
11040 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
11050 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
11060 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
11070 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20   p->iReg==0 ){. 
11080 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d       p->iLevel =
11090 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
110a0 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69  evel;.      p->i
110b0 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
110c0 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
110d0 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e   iCol;.      p->
110e0 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
110f0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
11100 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  0;.      p->lru 
11110 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
11120 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
11130 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
11140 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
11150 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75   last recently u
11160 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20  sed */.  minLru 
11170 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
11180 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66  idxLru = -1;.  f
11190 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
111a0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
111b0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
111c0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
111d0 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
111e0 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c  ru ){.      idxL
111f0 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69  ru = i;.      mi
11200 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
11210 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41     }.  }.  if( A
11220 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29  LWAYS(idxLru>=0)
11230 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61   ){.    p = &pPa
11240 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
11250 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69  dxLru];.    p->i
11260 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
11270 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
11280 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
11290 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  b;.    p->iColum
112a0 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = iCol;.    p-
112b0 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
112c0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
112d0 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70  ;.    p->lru = p
112e0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
112f0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
11300 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64    }.}../*.** Ind
11310 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73  icate that regis
11320 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65  ters between iRe
11330 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61  g..iReg+nReg-1 a
11340 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  re being overwri
11350 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74  tten..** Purge t
11360 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  he range of regi
11370 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63  sters from the c
11380 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
11390 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
113a0 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73  CacheRemove(Pars
113b0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
113c0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
113d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
113e0 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52  Last = iReg + nR
113f0 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74  eg - 1;.  struct
11400 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
11410 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11420 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11430 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11440 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11450 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
11460 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
11470 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20  Reg && r<=iLast 
11480 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
11490 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
114a0 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
114b0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
114c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  }.}../*.** Remem
114d0 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ber the current 
114e0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e  column cache con
114f0 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65  text.  Any new e
11500 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20  ntries added.** 
11510 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c  added to the col
11520 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20  umn cache after 
11530 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65  this call are re
11540 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  moved when the.*
11550 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
11560 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  pop occurs..*/.v
11570 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11580 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a  achePush(Parse *
11590 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
115a0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b  e->iCacheLevel++
115b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
115c0 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
115d0 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
115e0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
115f0 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
11600 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20   the previous N 
11610 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e  Push operations.
11620 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11630 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 61  , restore the ca
11640 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  che.** to the st
11650 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20  ate it was in N 
11660 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76  Pushes ago..*/.v
11670 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11680 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
11690 50 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20  Parse, int N){. 
116a0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
116b0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
116c0 20 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a   assert( N>0 );.
116d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
116e0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e  ->iCacheLevel>=N
116f0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
11700 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a  acheLevel -= N;.
11710 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11720 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11730 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11740 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11750 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
11760 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61  && p->iLevel>pPa
11770 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11780 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
11790 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
117a0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
117b0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
117c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
117d0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
117e0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
117f0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
11800 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
11810 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
11820 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
11830 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
11840 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
11850 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
11860 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
11870 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
11880 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
11890 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
118a0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
118b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
118c0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
118d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
118e0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
118f0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
11900 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
11910 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11920 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11930 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11940 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11950 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
11960 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
11970 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
11980 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
11990 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
119a0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
119b0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
119c0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
119d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
119e0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
119f0 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
11a00 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
11a10 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
11a20 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
11a30 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
11a40 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
11a50 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
11a60 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
11a70 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ur,    /* The cu
11a80 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74 61  rsor for this ta
11a90 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ble */.  int iCo
11aa0 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
11ab0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
11ac0 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
11ad0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
11ae0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
11af0 61 6c 75 64 20 69 6e 74 6f 20 74 68 69 73 20 72  alud into this r
11b00 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
11b10 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
11b20 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
11b30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11b40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11b50 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72  owid, iTabCur, r
11b60 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
11b70 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
11b80 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
11b90 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
11ba0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
11bb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11bc0 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 69 43   op, iTabCur, iC
11bd0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
11be0 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
11bf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
11c00 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
11c10 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
11c20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
11c30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
11c40 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
11c50 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
11c60 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
11c70 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
11c80 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
11c90 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
11ca0 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
11cb0 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
11cc0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
11cd0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
11ce0 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
11cf0 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
11d00 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
11d10 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
11d20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
11d30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
11d40 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
11d50 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
11d60 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
11d70 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
11d80 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
11d90 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
11da0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
11db0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
11dc0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
11dd0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
11de0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
11df0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
11e00 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
11e10 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
11e20 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
11e30 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
11e40 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
11e50 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
11e60 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
11e70 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
11e80 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
11e90 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
11ea0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
11eb0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
11ec0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
11ed0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
11ee0 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
11ef0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
11f00 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
11f10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11f20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
11f30 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
11f40 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
11f50 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11f60 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11f70 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11f80 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
11f90 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
11fa0 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
11fb0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
11fc0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
11fd0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
11fe0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
11ff0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
12000 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
12010 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
12020 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
12030 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
12040 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
12050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12060 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
12070 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
12080 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
12090 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
120a0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
120b0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
120c0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 72 65 74 75  n, iReg);.  retu
120d0 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
120e0 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
120f0 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
12100 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12110 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
12120 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
12130 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12140 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
12150 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
12160 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
12170 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
12180 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
12190 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
121a0 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
121b0 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
121c0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
121d0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
121e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f   }.}../*.** Reco
121f0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
12200 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
12210 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
12220 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
12230 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
12240 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
12250 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
12260 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
12270 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
12280 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
12290 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73  int iCount){.  s
122a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
122b0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53  emove(pParse, iS
122c0 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d  tart, iCount);.}
122d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
122e0 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
122f0 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
12300 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
12310 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
12320 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
12330 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
12340 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
12350 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
12360 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
12370 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
12380 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
12390 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
123a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
123b0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
123c0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69 46  ;.  if( NEVER(iF
123d0 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75  rom==iTo) ) retu
123e0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn;.  sqlite3Vdb
123f0 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e  eAddOp3(pParse->
12400 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20  pVdbe, OP_Move, 
12410 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67  iFrom, iTo, nReg
12420 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  );.  for(i=0, p=
12430 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
12440 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
12450 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
12460 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
12470 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
12480 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46  x>=iFrom && x<iF
12490 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  rom+nReg ){.    
124a0 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f    p->iReg += iTo
124b0 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20  -iFrom;.    }.  
124c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
124d0 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 70 79  ate code to copy
124e0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
124f0 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
12500 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
12510 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
12520 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64  +nReg-1..*/.void
12530 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12540 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
12550 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
12560 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
12570 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12580 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69  ( NEVER(iFrom==i
12590 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  To) ) return;.  
125a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b  for(i=0; i<nReg;
125b0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
125c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
125d0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
125e0 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54  opy, iFrom+i, iT
125f0 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  o+i);.  }.}..#if
12600 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12610 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
12620 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
12630 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
12640 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
12650 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
12660 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
12670 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
12680 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
12690 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
126a0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
126b0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
126c0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
126d0 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
126e0 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
126f0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
12700 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
12710 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
12720 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
12730 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
12740 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
12750 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
12760 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
12770 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
12780 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12790 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
127a0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
127b0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
127c0 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
127d0 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
127e0 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
127f0 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
12800 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
12810 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
12820 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
12830 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
12840 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
12850 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
12860 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
12870 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
12880 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
12890 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
128a0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
128b0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
128c0 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
128d0 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
128e0 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
128f0 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
12900 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
12910 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
12920 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
12930 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
12940 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
12950 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
12960 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
12970 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
12980 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
12990 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
129a0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
129b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
129c0 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
129d0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
129e0 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
129f0 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
12a00 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
12a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
12a20 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
12a30 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
12a40 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
12a50 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
12a60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12a70 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
12a80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
12a90 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ab0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
12ac0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
12ad0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
12ae0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
12af0 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
12b00 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
12b10 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
12b20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
12b30 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
12b40 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
12b50 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
12b60 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
12b70 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
12b80 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
12b90 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
12ba0 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
12bb0 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20  , r3, r4;       
12bc0 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
12bd0 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
12be0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12bf0 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
12c00 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12c10 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
12c20 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
12c30 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
12c40 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
12c50 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
12c60 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12c70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
12c80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12c90 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
12ca0 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e  ){.    op = TK_N
12cb0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
12cc0 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
12cd0 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
12ce0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
12cf0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
12d00 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
12d10 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d  AggInfo = pExpr-
12d20 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
12d30 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
12d40 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67  col *pCol = &pAg
12d50 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70  gInfo->aCol[pExp
12d60 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20  r->iAgg];.      
12d70 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64  if( !pAggInfo->d
12d80 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20  irectMode ){.   
12d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
12da0 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20  l->iMem>0 );.   
12db0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f       inReg = pCo
12dc0 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20  l->iMem;.       
12dd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
12de0 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f  lse if( pAggInfo
12df0 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  ->useSortingIdx 
12e00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12e10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12e20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49  OP_Column, pAggI
12e30 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50  nfo->sortingIdxP
12e40 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e60 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
12e70 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
12e80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
12ea0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
12eb0 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
12ec0 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
12ed0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12ee0 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
12ef0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
12f00 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
12f10 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
12f20 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
12f30 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
12f40 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
12f50 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12f60 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20  ckBase>0 );.    
12f70 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
12f80 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
12f90 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
12fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12fb0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
12fc0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12fd0 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
12fe0 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
13010 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  iColumn, pExpr->
13020 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
13030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13040 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13050 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
13060 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
13070 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78  eger(pParse, pEx
13080 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
13090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
130a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
130b0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
130c0 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
130d0 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
130e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
130f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
13100 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
13110 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
13120 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
13130 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
13140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13150 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
13160 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
13170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13180 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13190 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
131a0 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
131b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
131c0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
131d0 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72  target, 0, pExpr
131e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
131f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13200 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
13210 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
13220 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13230 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
13240 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
13250 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
13260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
13270 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
13280 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
13290 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
132a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
132b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
132c0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
132d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
132e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
132f0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
13300 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13310 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
13320 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
13330 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
13340 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13350 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
13360 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
13370 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
13380 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
13390 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
133a0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
133b0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
133c0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
133d0 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
133e0 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
133f0 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
13400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13410 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
13420 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
13430 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
13440 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
13450 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13460 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
13470 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
13480 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13490 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
134a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
134b0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
134c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
134d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
134e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
134f0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
13500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13510 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
13520 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
13530 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
13540 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
13550 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
13560 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13570 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
13580 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
13590 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
135a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
135b0 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
135c0 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
135d0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
135e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
135f0 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
13600 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
13610 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
13620 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
13630 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13640 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
13650 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
13660 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
13670 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
13680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13690 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69  TK_AS: {.      i
136a0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
136b0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
136c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
136d0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
136e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
136f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13700 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
13710 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
13720 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
13730 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
13740 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
13750 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
13760 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20  t aff, to_op;.  
13770 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
13780 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
13790 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
137a0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
137b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
137c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
137d0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
137e0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66  ue) );.      aff
137f0 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
13800 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
13810 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74  zToken);.      t
13820 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
13830 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
13840 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
13850 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
13860 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
13870 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
13880 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
13890 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
138a0 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
138b0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
138c0 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
138d0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
138e0 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
138f0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
13900 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
13910 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
13920 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
13930 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
13940 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
13950 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
13960 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
13970 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
13980 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
13990 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
139a0 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20  =OP_ToText );.  
139b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
139c0 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29  _op==OP_ToBlob )
139d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
139e0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
139f0 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74  meric );.      t
13a00 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
13a10 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20  OP_ToInt );.    
13a20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
13a30 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a  p==OP_ToReal );.
13a40 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
13a50 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
13a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13a70 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
13a80 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
13a90 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
13aa0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
13ab0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
13ac0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f  dbeAddOp1(v, to_
13ad0 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  op, inReg);.    
13ae0 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
13af0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
13b00 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
13b10 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
13b20 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
13b30 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
13b40 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
13b50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13b60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13b70 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
13b80 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
13b90 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
13ba0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
13bb0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
13bc0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
13bd0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
13be0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13bf0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
13c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13c10 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
13c20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
13c30 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
13c40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
13c50 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
13c60 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
13c70 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
13c80 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
13c90 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Ne );.      test
13ca0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
13cb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13cc0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
13cd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13ce0 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
13cf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
13d00 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
13d10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13d20 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
13d30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
13d40 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
13d50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
13d60 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
13d70 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
13d80 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
13d90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13da0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
13db0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
13dc0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
13dd0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
13de0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
13df0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
13e00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13e10 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
13e20 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
13e30 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
13e40 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
13e50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13e60 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
13e70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13e80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13e90 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
13ea0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
13eb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13ec0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
13ed0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
13ee0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
13ef0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13f00 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
13f10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
13f20 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
13f30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13f40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
13f50 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
13f60 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
13f70 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
13f80 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
13f90 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
13fa0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
13fb0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
13fc0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13fe0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
13ff0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
14000 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
14010 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14020 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
14030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14040 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
14050 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14060 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
14070 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
14080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
14090 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
140a0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
140b0 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
140c0 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
140d0 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
140e0 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
140f0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
14100 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
14110 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
14120 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
14130 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
14140 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14150 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
14160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14170 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
14180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14190 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
141a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
141b0 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
141c0 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
141d0 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
141e0 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
141f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
14200 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
14210 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14220 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
14230 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
14240 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
14250 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
14260 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
14270 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
14280 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
14290 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
142a0 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
142b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
142c0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
142d0 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  at );.      test
142e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
142f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14300 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
14310 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14320 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
14330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14340 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
14350 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14360 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
14370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14380 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
14390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
143a0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
143b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
143c0 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
143d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
143e0 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
143f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14400 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
14410 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14420 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
14430 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14440 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14450 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14460 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14470 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
14480 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14490 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
144a0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
144b0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
144c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
144d0 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
144e0 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
144f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14500 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14510 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
14520 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14530 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14540 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
14550 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
14560 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
14570 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
14580 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
14590 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
145a0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
145b0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
145c0 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
145d0 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  rget);.#ifndef S
145e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
145f0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
14600 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
14610 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
14620 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14630 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14640 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14650 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
14660 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
14670 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
14680 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
14690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
146a0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
146b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
146c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
146d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
146e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
146f0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
14700 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
14710 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14720 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14730 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14740 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
14750 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14760 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
14770 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
14780 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14790 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
147a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
147b0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
147c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
147d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
147e0 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
147f0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
14800 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
14810 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
14820 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14830 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
14840 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14850 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
14860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14870 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
14880 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
14890 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
148a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
148b0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
148c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
148d0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
148e0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
148f0 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
14900 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
14910 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
14920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14930 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
14940 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
14950 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
14960 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14970 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
14980 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
14990 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
149a0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
149b0 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
149c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
149d0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
149e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
149f0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
14a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14a10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14a20 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
14a30 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14a40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14a50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14a60 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
14a70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14a80 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
14a90 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14aa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14ab0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
14ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14ad0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
14ae0 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
14af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14b00 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
14b10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14b20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14b30 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
14b40 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
14b50 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
14b60 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
14b70 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
14b80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14b90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14ba0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
14bb0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
14bc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14bd0 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
14be0 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
14bf0 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
14c00 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
14c10 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
14c20 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
14c30 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
14c40 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
14c50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14c60 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
14c70 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20  _FUNC:.    case 
14c80 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
14c90 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
14ca0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
14cb0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
14cc0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
14cd0 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
14ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14cf0 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
14d00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
14d10 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
14d20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
14d30 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
14d40 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
14d50 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
14d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
14d70 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e  ength of the fun
14d80 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79  ction name in by
14d90 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
14da0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
14db0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
14dc0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
14dd0 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20    int constMask 
14de0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
14df0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
14e00 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
14e10 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
14e20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
14e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14e40 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
14e50 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
14e60 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
14e70 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
14e80 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
14e90 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
14ea0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
14eb0 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
14ec0 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
14ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
14ee0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14ef0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14f00 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ct) );.      tes
14f10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
14f20 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20  NST_FUNC );.    
14f30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f40 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
14f50 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
14f60 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
14f70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
14f80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
14f90 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
14fa0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
14fb0 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
14fc0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
14fd0 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
14fe0 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
14ff0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
15000 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
15010 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
15020 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
15030 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
15040 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
15050 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15060 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
15070 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
15080 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
15090 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65  d, nId, nFarg, e
150a0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
150b0 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
150c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
150d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
150e0 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
150f0 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49  %.*s()", nId, zI
15100 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
15110 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
15120 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
15130 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
15140 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
15150 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
15160 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
15170 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
15180 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
15190 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61 74  necessary evalat
151a0 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
151b0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
151c0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
151d0 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
151e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
151f0 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
15200 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
15210 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
15220 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
15230 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15240 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
15250 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
15260 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
15270 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15280 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
15290 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
152a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
152b0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
152c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
152d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
152e0 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
152f0 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
15300 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15310 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
15320 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
15330 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15340 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15350 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
15360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15370 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15380 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
15390 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
153a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
153b0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
153c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
153d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
153e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
153f0 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  v, endCoalesce);
15400 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15410 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
15420 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
15430 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15440 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
15450 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
15460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15470 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
15480 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
15490 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
154a0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
154b0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
154c0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
154d0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
154e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
154f0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
15500 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
15510 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
15520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15530 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
15540 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
15550 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
15560 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
15570 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
15580 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
15590 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
155a0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
155b0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
155c0 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
155d0 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
155e0 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
155f0 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
15600 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
15610 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
15620 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
15630 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
15640 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
15650 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
15660 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
15670 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
15680 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
15690 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
156a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
156b0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
156c0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
156d0 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
156e0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
156f0 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
15700 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
15710 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15720 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
15730 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
15740 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
15750 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
15760 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
15770 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
15780 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
15790 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
157a0 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
157b0 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
157c0 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
157d0 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
157e0 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
157f0 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
15800 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
15810 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
15820 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
15830 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
15840 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
15850 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
15860 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
15870 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
15880 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
15890 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
158a0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
158b0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
158c0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
158d0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
158e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
158f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
15900 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15910 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
15920 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
15930 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
15940 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
15950 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
15960 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
15970 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
15980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
15990 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
159a0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
159b0 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
159c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
159d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
159e0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
159f0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
15a00 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
15a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15a20 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  f( pDef->flags &
15a30 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
15a40 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
15a50 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
15a60 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
15a70 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
15a80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15a90 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
15aa0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
15ab0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
15ac0 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
15ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15ae0 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
15af0 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
15b00 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
15b30 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
15b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15b50 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
15b60 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
15b70 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  nFarg ){.       
15b80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15b90 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
15ba0 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
15bb0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15bc0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
15bd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15be0 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
15bf0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
15c00 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
15c10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15c20 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
15c30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15c40 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
15c50 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
15c60 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
15c70 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
15c80 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
15c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15ca0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
15cb0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
15cc0 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
15cd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15ce0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
15cf0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
15d00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
15d30 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
15d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15d50 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
15d60 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
15d70 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
15d80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15d90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15da0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
15db0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
15dc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15dd0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
15de0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15e00 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
15e10 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
15e20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15e30 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
15e40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15e50 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
15e60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15e70 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
15e80 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
15e90 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
15ea0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
15eb0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
15ec0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
15ed0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
15ee0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
15ef0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
15f00 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
15f10 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
15f20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
15f30 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
15f40 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
15f50 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
15f60 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
15f70 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
15f80 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
15f90 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
15fa0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
15fb0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
15fc0 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
15fd0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
15fe0 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
15ff0 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
16000 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31  pExpr;..      r1
16010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16020 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16030 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16040 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
16050 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16060 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
16070 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
16080 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16090 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
160a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
160b0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
160c0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
160d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
160e0 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
160f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
16100 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
16110 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
16120 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
16130 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
16140 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
16150 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
16160 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  EP2);.      pLIt
16170 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
16180 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
16190 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
161a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
161b0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
161c0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
161d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
161e0 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
161f0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
16200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16210 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
16220 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
16230 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
16240 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
16250 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f   r2, r4, SQLITE_
16260 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
16270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16280 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
16290 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
162a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
162b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
162c0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
162d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
162e0 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
162f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16300 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
16310 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
16320 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
16330 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
16340 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16350 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16360 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16370 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
16380 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
16390 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
163a0 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
163b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
163c0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
163d0 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
163e0 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
163f0 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
16400 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
16410 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
16420 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
16430 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
16440 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
16450 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
16460 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
16470 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
16480 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
16490 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
164a0 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
164b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
164c0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
164d0 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
164e0 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
164f0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
16500 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
16510 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
16520 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
16530 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
16540 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
16550 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
16560 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
16570 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
16580 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
16590 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
165a0 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
165b0 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
165c0 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
165d0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
165e0 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
165f0 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
16600 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
16610 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
16620 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
16630 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
16640 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
16650 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
16660 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
16670 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
16680 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
16690 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
166a0 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
166b0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
166c0 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
166d0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
166e0 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
166f0 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
16700 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
16710 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
16720 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
16730 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
16740 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
16750 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
16760 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
16770 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16780 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
16790 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
167a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
167b0 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
167c0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
167d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
167e0 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
167f0 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
16800 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
16810 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
16820 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
16830 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
16840 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
16850 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
16860 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
16870 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
16880 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
16890 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
168a0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
168b0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
168c0 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
168d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
168e0 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
168f0 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
16900 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
16910 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
16920 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
16930 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
16940 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16950 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
16960 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
16970 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
16980 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
16990 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
169a0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
169b0 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
169c0 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
169d0 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
169e0 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
169f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16a00 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
16a10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16a20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
16a30 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c   "%s.%s -> $%d",
16a40 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
16a50 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
16a60 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
16a70 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
16a80 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
16a90 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
16aa0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
16ab0 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ].zName),.      
16ac0 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29    target.      )
16ad0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
16ae0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
16af0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
16b00 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
16b10 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
16b20 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
16b30 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
16b40 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
16b50 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
16b60 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
16b70 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
16b80 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20  y real.  */.    
16b90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
16ba0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
16bb0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
16bc0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
16bd0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
16be0 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
16bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16c00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16c10 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
16c20 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
16c30 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
16c40 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
16c50 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
16c60 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
16c70 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
16c80 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
16c90 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
16ca0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
16cb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
16cc0 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
16cd0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
16ce0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
16cf0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
16d00 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
16d10 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
16d20 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
16d30 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
16d40 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
16d50 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
16d60 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
16d70 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
16d80 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
16d90 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
16da0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
16db0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
16dc0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
16dd0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
16de0 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
16df0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
16e00 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e   Y is in pExpr->
16e10 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20 69  pRight.  The Y i
16e20 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  s also optional.
16e30 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
16e40 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61  .    ** ELSE cla
16e50 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  use and no other
16e60 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74   term matches, t
16e70 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
16e80 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70  f the.    ** exp
16e90 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a  rssion is NULL..
16ea0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
16eb0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
16ec0 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
16ed0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
16ee0 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
16ef0 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
16f00 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
16f10 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
16f20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
16f30 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
16f40 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
16f50 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
16f60 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
16f70 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
16f80 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
16f90 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
16fa0 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
16fb0 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
16fc0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
16fd0 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ff0 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
17000 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
17010 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
17020 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
17030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
17040 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
17050 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
17060 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
17070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17080 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
17090 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
170a0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
170b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
170d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
170e0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
170f0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
17100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
17110 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
17120 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
17130 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
17140 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
17150 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
17160 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
17170 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17190 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
171a0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
171b0 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20 20  pr cacheX;      
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65 73  /* Cached expres
171e0 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20  sion X */.      
171f0 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
17220 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
17230 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
17260 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
17270 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20  orm B) */.      
17280 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43  VVA_ONLY( int iC
17290 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72  acheLevel = pPar
172a0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
172b0 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   )..      assert
172c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
172d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
172e0 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
172f0 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20  ->x.pList );.   
17300 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
17310 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
17320 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20   % 2) == 0);.   
17330 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
17340 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
17350 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
17360 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
17370 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
17380 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
17390 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
173a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
173b0 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
173c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
173d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
173e0 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e  f( (pX = pExpr->
173f0 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
17400 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70       cacheX = *p
17410 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
17420 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
17430 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
17440 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
17450 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
17460 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
17470 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
17480 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17490 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
174a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74  ree1);.        t
174b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
174c0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
174d0 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
174e0 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
174f0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
17500 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
17510 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
17520 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
17530 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
17540 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
17550 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
17560 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
17570 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
17580 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
17590 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
175a0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
175b0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
175c0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
175d0 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
175e0 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
175f0 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
17600 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
17610 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
17620 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
17630 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
17640 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
17650 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
17660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
17670 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
17680 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
17690 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
176a0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
176b0 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
176c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
176d0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
176e0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
176f0 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
17700 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
17710 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17720 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
17730 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
17740 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
17750 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
17760 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17770 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
17780 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
17790 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
177a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
177b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
177c0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
177d0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
177e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
177f0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
17800 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
17810 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
17820 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
17830 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
17840 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
17850 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
17860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17870 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
17880 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
17890 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
178a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
178c0 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
178d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
178e0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
178f0 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
17900 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17910 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
17920 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
17930 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17940 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
17950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17960 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
17970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17980 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
17990 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
179a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
179b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
179c0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
179d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
179e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
179f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
17a00 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
17a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
17a20 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
17a30 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
17a40 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
17a50 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
17a60 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
17a70 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
17a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17a90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
17aa0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
17ab0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
17ac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17ad0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
17ae0 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
17af0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17b00 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
17b10 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
17b20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
17b30 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
17b40 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
17b50 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17b60 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
17b70 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
17b80 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
17b90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
17ba0 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
17bb0 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
17bc0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17bd0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
17c00 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
17c10 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
17c20 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
17c30 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
17c40 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
17c50 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
17c60 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
17c70 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
17c80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17c90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
17ca0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17cb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
17cc0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
17cd0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
17ce0 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
17cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17d00 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
17d10 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
17d20 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
17d30 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
17d40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
17d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17d60 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
17d70 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
17d80 65 2c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  e, pExpr->affini
17d90 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
17da0 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ken, 0);.      }
17db0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
17dc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
17dd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17de0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17df0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
17e00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17e10 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
17e20 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
17e30 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nReg;.}../*.** G
17e40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
17e50 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
17e60 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
17e70 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
17e80 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
17e90 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
17ea0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
17eb0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
17ec0 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
17ed0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
17ee0 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
17ef0 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
17f00 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
17f10 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
17f20 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
17f30 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
17f40 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
17f50 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
17f60 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
17f70 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
17f80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
17f90 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
17fa0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17fb0 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
17fc0 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  g){.  int r1 = s
17fd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17fe0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
17ff0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
18000 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
18010 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
18020 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
18030 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
18040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
18050 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18060 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18070 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
18080 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
18090 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
180a0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
180b0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
180c0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
180d0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
180e0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
180f0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
18100 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
18110 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
18120 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
18130 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
18140 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
18150 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
18160 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
18170 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
18180 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
18190 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
181a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
181b0 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
181c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
181d0 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
181e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
181f0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
18200 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
18210 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
18220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
18230 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
18240 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
18250 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
18260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
18270 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70  arse->pVdbe || p
18280 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18290 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
182a0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
182b0 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
182c0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
182d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
182e0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
182f0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
18300 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
18310 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
18320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
18330 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
18340 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  lutes the given 
18350 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
18360 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
18370 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
18380 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
18390 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
183a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
183b0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
183c0 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
183d0 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
183e0 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
183f0 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
18400 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
18410 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
18420 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
18430 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
18440 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
18450 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
18460 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
18470 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
18480 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
18490 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
184a0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
184b0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
184c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
184d0 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
184e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
184f0 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61  rCodeAndCache(Pa
18500 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
18510 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
18520 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
18530 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
18540 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20  ;.  int inReg;. 
18550 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
18560 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
18570 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
18580 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
18590 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73  t>0 );.  /* This
185a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
185b0 65 64 20 66 6f 72 20 74 65 72 6d 73 20 74 6f 20  ed for terms to 
185c0 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
185d0 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a  .  And the only.
185e0 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63 65    ** other place
185f0 20 77 68 65 72 65 20 65 78 70 72 65 73 73 69 6f   where expressio
18600 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  ns can be conver
18610 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49  ted into TK_REGI
18620 53 54 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20  STER is.  ** in 
18630 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
18640 63 65 73 73 69 6e 67 2e 20 20 53 6f 20 61 73 20  cessing.  So as 
18650 63 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d  currently implem
18660 65 6e 74 65 64 2c 20 74 68 65 72 65 20 69 73 0a  ented, there is.
18670 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20    ** no way for 
18680 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 74 6f  a TK_REGISTER to
18690 20 65 78 69 73 74 20 68 65 72 65 2e 20 20 42 75   exist here.  Bu
186a0 74 20 69 74 20 73 65 65 6d 73 20 70 72 75 64 65  t it seems prude
186b0 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  nt to.  ** keep 
186c0 74 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e 20  the ALWAYS() in 
186d0 63 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74 69  case the conditi
186e0 6f 6e 73 20 61 62 6f 76 65 20 63 68 61 6e 67 65  ons above change
186f0 20 77 69 74 68 20 66 75 74 75 72 65 0a 20 20 2a   with future.  *
18700 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  * modifications 
18710 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e  or enhancements.
18720 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
18730 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52  (pExpr->op!=TK_R
18740 45 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20 20  EGISTER) ){  .  
18750 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20    int iMem;.    
18760 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
18770 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
18780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18790 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  OP_Copy, inReg, 
187a0 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72  iMem);.    pExpr
187b0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b  ->iTable = iMem;
187c0 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20  .    pExpr->op2 
187d0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  = pExpr->op;.   
187e0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
187f0 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20  REGISTER;.  }.  
18800 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
18810 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
18820 55 45 20 69 66 20 70 45 78 70 72 20 69 73 20 61  UE if pExpr is a
18830 6e 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  n constant expre
18840 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70  ssion that is ap
18850 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72  propriate.** for
18860 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f   factoring out o
18870 66 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f  f a loop.  Appro
18880 70 72 69 61 74 65 20 65 78 70 72 65 73 73 69 6f  priate expressio
18890 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ns are:.**.**   
188a0 20 2a 20 20 41 6e 79 20 65 78 70 72 65 73 73 69   *  Any expressi
188b0 6f 6e 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  on that evaluate
188c0 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s to two or more
188d0 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20   opcodes..**.** 
188e0 20 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74     *  Any OP_Int
188f0 65 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f  eger, OP_Real, O
18900 50 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f  P_String, OP_Blo
18910 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20  b, OP_Null, .** 
18920 20 20 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69        or OP_Vari
18930 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  able that does n
18940 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c  ot need to be pl
18950 61 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20  aced in a .**   
18960 20 20 20 20 73 70 65 63 69 66 69 63 20 72 65 67      specific reg
18970 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ister..**.** The
18980 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
18990 6e 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20  n factoring out 
189a0 73 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69  single-instructi
189b0 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65  on constant.** e
189c0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
189d0 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
189e0 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
189f0 72 20 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a  r register.  .**
18a00 20 57 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72   We could factor
18a10 20 74 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74   them out, but t
18a20 68 65 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64  hen we would end
18a30 20 75 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a   up adding an.**
18a40 20 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75   OP_SCopy instru
18a50 63 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68  ction to move th
18a60 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  e value into the
18a70 20 63 6f 72 72 65 63 74 20 72 65 67 69 73 74 65   correct registe
18a80 72 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20  r.** later.  We 
18a90 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75  might as well ju
18aa0 73 74 20 75 73 65 20 74 68 65 20 6f 72 69 67 69  st use the origi
18ab0 6e 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nal instruction 
18ac0 61 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65  and.** avoid the
18ad0 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74   OP_SCopy..*/.st
18ae0 61 74 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f  atic int isAppro
18af0 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69  priateForFactori
18b00 6e 67 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ng(Expr *p){.  i
18b10 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
18b20 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
18b30 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (p) ){.    retur
18b40 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f  n 0;  /* Only co
18b50 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
18b60 6e 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ns are appropria
18b70 74 65 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67  te for factoring
18b80 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
18b90 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78  ->flags & EP_Fix
18ba0 65 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20  edDest)==0 ){.  
18bb0 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
18bc0 41 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74  Any constant wit
18bd0 68 6f 75 74 20 61 20 66 69 78 65 64 20 64 65 73  hout a fixed des
18be0 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72  tination is appr
18bf0 6f 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20  opriate */.  }. 
18c00 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
18c10 4b 5f 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d  K_UPLUS ) p = p-
18c20 3e 70 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68  >pLeft;.  switch
18c30 28 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64  ( p->op ){.#ifnd
18c40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
18c50 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
18c60 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65  case TK_BLOB:.#e
18c70 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
18c80 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63  _VARIABLE:.    c
18c90 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
18ca0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
18cb0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
18cc0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
18cd0 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
18ce0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
18cf0 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  ==TK_BLOB );.   
18d00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
18d10 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
18d20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18d30 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  e( p->op==TK_INT
18d40 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  EGER );.      te
18d50 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
18d60 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20  K_FLOAT );.     
18d70 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
18d80 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  ==TK_NULL );.   
18d90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
18da0 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b  op==TK_STRING );
18db0 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65  .      /* Single
18dc0 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
18dd0 73 74 61 6e 74 73 20 77 69 74 68 20 61 20 66 69  stants with a fi
18de0 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  xed destination 
18df0 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74  are.      ** bet
18e00 74 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65  ter done in-line
18e10 2e 20 20 49 66 20 77 65 20 66 61 63 74 6f 72 20  .  If we factor 
18e20 74 68 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20  them, they will 
18e30 6a 75 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a  just end.      *
18e40 2a 20 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20  * up generating 
18e50 61 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d  an OP_SCopy to m
18e60 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ove the value to
18e70 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
18e80 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74  .      ** regist
18e90 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  er. */.      ret
18ea0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
18eb0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
18ec0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
18ed0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
18ee0 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d  OAT || p->pLeft-
18ef0 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
18f00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18f10 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
18f20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18f30 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
18f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18f50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
18f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45  ;.}../*.** If pE
18f70 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
18f80 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  t expression tha
18f90 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
18fa0 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e   for.** factorin
18fb0 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c  g out of a loop,
18fc0 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
18fd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
18fe0 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
18ff0 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65   and convert the
19000 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f   expression into
19010 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a   a TK_REGISTER.*
19020 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  * expression..*/
19030 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c  .static int eval
19040 43 6f 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72  ConstExpr(Walker
19050 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
19060 2a 70 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65  *pExpr){.  Parse
19070 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
19080 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77  er->pParse;.  sw
19090 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
190a0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
190b0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  N:.    case TK_R
190c0 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
190d0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
190e0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  e;.    }.    cas
190f0 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
19100 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
19110 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
19120 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
19130 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
19140 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66  arguments to a f
19150 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66  unction have a f
19160 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
19170 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20  ..      ** Mark 
19180 74 68 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f  them this way to
19190 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64   avoid generated
191a0 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f   unneeded OP_SCo
191b0 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  py.      ** inst
191c0 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20  ructions. .     
191d0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
191e0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
191f0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
19200 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
19210 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19220 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
19230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
19240 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
19250 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t i = pList->nEx
19260 70 72 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  pr;.        stru
19270 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
19280 20 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d   *pItem = pList-
19290 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
192a0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
192b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
192c0 69 66 28 20 41 4c 57 41 59 53 28 70 49 74 65 6d  if( ALWAYS(pItem
192d0 2d 3e 70 45 78 70 72 29 20 29 20 70 49 74 65 6d  ->pExpr) ) pItem
192e0 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c  ->pExpr->flags |
192f0 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a  = EP_FixedDest;.
19300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19310 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
19320 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
19330 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46  sAppropriateForF
19340 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20  actoring(pExpr) 
19350 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  ){.    int r1 = 
19360 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19370 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20      int r2;.    
19380 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
19390 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
193a0 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
193b0 20 20 20 69 66 28 20 4e 45 56 45 52 28 72 31 21     if( NEVER(r1!
193c0 3d 72 32 29 20 29 20 73 71 6c 69 74 65 33 52 65  =r2) ) sqlite3Re
193d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
193e0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 70 45  rse, r1);.    pE
193f0 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72  xpr->op2 = pExpr
19400 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d  ->op;.    pExpr-
19410 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
19420 52 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  R;.    pExpr->iT
19430 61 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72  able = r2;.    r
19440 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
19450 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
19460 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
19470 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65  *.** Preevaluate
19480 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
19490 72 65 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20  ressions within 
194a0 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
194b0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
194c0 6e 20 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f  n registers.  Mo
194d0 64 69 66 79 20 70 45 78 70 72 20 73 6f 20 74 68  dify pExpr so th
194e0 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
194f0 73 75 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a  subexpresions.**
19500 20 61 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52   are TK_REGISTER
19510 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 72 65   opcodes that re
19520 66 65 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f  fer to the preco
19530 6d 70 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a  mputed values..*
19540 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19550 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
19560 74 68 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  the jump to the 
19570 63 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 63 6f 64  cookie-check cod
19580 65 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  e has.** already
19590 20 6f 63 63 75 72 2e 20 20 53 69 6e 63 65 20 74   occur.  Since t
195a0 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b 20  he cookie-check 
195b0 6a 75 6d 70 20 69 73 20 67 65 6e 65 72 61 74 65  jump is generate
195c0 64 20 70 72 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e  d prior to.** an
195d0 79 20 6f 74 68 65 72 20 73 65 72 69 6f 75 73 20  y other serious 
195e0 70 72 6f 63 65 73 73 69 6e 67 2c 20 74 68 69 73  processing, this
195f0 20 63 68 65 63 6b 20 65 6e 73 75 72 65 73 20 74   check ensures t
19600 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 0a  hat there is no.
19610 2a 2a 20 77 61 79 20 74 6f 20 61 63 63 69 64 65  ** way to accide
19620 6e 74 6c 79 20 62 79 70 61 73 73 20 74 68 65 20  ntly bypass the 
19630 63 6f 6e 73 74 61 6e 74 20 69 6e 69 74 69 61 6c  constant initial
19640 69 7a 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  izations..**.** 
19650 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19660 61 6c 73 6f 20 61 20 6e 6f 2d 6f 70 20 69 66 20  also a no-op if 
19670 74 68 65 20 53 51 4c 49 54 45 5f 46 61 63 74 6f  the SQLITE_Facto
19680 72 4f 75 74 43 6f 6e 73 74 20 6f 70 74 69 6d 69  rOutConst optimi
19690 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 69 73  zation.** is dis
196a0 61 62 6c 65 64 20 76 69 61 20 74 68 65 20 73 71  abled via the sq
196b0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
196c0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
196d0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
196e0 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20  ).** interface. 
196f0 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 65 73   This allows tes
19700 74 20 6c 6f 67 69 63 20 74 6f 20 76 65 72 69 66  t logic to verif
19710 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  y that the same 
19720 61 6e 73 77 65 72 20 69 73 0a 2a 2a 20 6f 62 74  answer is.** obt
19730 61 69 6e 65 64 20 66 6f 72 20 71 75 65 72 69 65  ained for querie
19740 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  s regardless of 
19750 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 63  whether or not c
19760 6f 6e 73 74 61 6e 74 73 20 61 72 65 0a 2a 2a 20  onstants are.** 
19770 70 72 65 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f  precomputed into
19780 20 72 65 67 69 73 74 65 72 73 20 6f 72 20 69 66   registers or if
19790 20 74 68 65 79 20 61 72 65 20 69 6e 73 65 72 74   they are insert
197a0 65 64 20 69 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76  ed in-line..*/.v
197b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
197c0 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72  odeConstants(Par
197d0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
197e0 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
197f0 65 72 20 77 3b 0a 20 20 69 66 28 20 70 50 61 72  er w;.  if( pPar
19800 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 29  se->cookieGoto )
19810 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
19820 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
19830 73 20 26 20 53 51 4c 49 54 45 5f 46 61 63 74 6f  s & SQLITE_Facto
19840 72 4f 75 74 43 6f 6e 73 74 29 21 3d 30 20 29 20  rOutConst)!=0 ) 
19850 72 65 74 75 72 6e 3b 0a 20 20 77 2e 78 45 78 70  return;.  w.xExp
19860 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c  rCallback = eval
19870 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78  ConstExpr;.  w.x
19880 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
19890 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d   0;.  w.pParse =
198a0 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
198b0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
198c0 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Expr);.}.../*.**
198d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
198e0 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
198f0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
19900 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
19910 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
19920 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
19930 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
19940 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
19950 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
19960 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
19970 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
19980 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uated..*/.int sq
19990 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
199a0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
199b0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
199c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
199d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
199e0 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
199f0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
19a00 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
19a10 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
19a20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
19a30 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
19a40 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20   int doHardCopy 
19a50 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61      /* Make a ha
19a60 72 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79  rd copy of every
19a70 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
19a80 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19a90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19aa0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65  int i, n;.  asse
19ab0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
19ac0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
19ad0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19ae0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
19af0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
19b00 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
19b10 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
19b20 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
19b30 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
19b40 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
19b50 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19b60 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
19b70 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
19b80 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
19b90 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
19ba0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
19bb0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
19bc0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
19bd0 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t+i ){.      sql
19be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
19bf0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f  Parse->pVdbe, do
19c00 48 61 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f  HardCopy ? OP_Co
19c10 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  py : OP_SCopy,. 
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 20 20 20 20 20 20 20 69 6e 52 65 67 2c 20 74 61         inReg, ta
19c40 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  rget+i);.    }. 
19c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
19c60 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19c70 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
19c80 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
19c90 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
19ca0 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
19cb0 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
19cc0 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
19cd0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
19ce0 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
19cf0 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
19d00 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
19d10 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
19d20 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74  ion.** elementat
19d30 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61  ion of x..*/.sta
19d40 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
19d50 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
19d60 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
19d70 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
19d80 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
19d90 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
19da0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
19db0 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
19dc0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
19dd0 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
19de0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
19df0 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a   jump is taken *
19e00 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72  /.  int jumpIfTr
19e10 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ue,   /* Take th
19e20 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
19e30 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f  TWEEN is true */
19e40 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
19e50 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
19e60 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
19e70 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
19e80 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e  ){.  Expr exprAn
19e90 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
19ea0 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
19eb0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
19ec0 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
19ed0 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
19ee0 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
19ef0 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
19f00 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
19f10 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
19f20 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
19f30 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
19f40 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
19f50 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
19f60 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
19f70 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
19f80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19f90 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
19fa0 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
19fb0 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
19fc0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
19fd0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
19fe0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
19ff0 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1a000 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
1a010 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
1a020 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
1a030 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
1a040 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
1a050 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
1a060 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1a070 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
1a080 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
1a090 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
1a0a0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1a0b0 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
1a0c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1a0d0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
1a0e0 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  xprX.iTable = sq
1a0f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a100 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
1a110 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1a120 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45  exprX.op = TK_RE
1a130 47 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75  GISTER;.  if( ju
1a140 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20  mpIfTrue ){.    
1a150 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1a160 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1a170 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1a180 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
1a190 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a1a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
1a1b0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1a1c0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1a1d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1a1e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1a1f0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
1a200 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
1a210 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
1a220 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
1a230 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1a240 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1a250 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1a260 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1a270 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1a280 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1a290 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1a2a0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1a2b0 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1a2c0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1a2d0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1a2e0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1a2f0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1a300 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1a310 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1a320 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1a330 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1a340 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1a350 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1a360 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1a370 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1a380 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1a390 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a3a0 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1a3b0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1a3c0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1a3d0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a3e0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1a3f0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1a400 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
1a410 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a420 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1a430 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1a440 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1a450 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1a460 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1a470 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1a480 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
1a490 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1a4a0 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1a4b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1a4c0 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
1a4d0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1a4e0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1a4f0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1a500 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
1a510 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
1a520 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
1a530 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
1a540 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
1a550 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
1a560 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1a570 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
1a580 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
1a590 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
1a5a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
1a5b0 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
1a5c0 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
1a5d0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
1a5e0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
1a5f0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
1a600 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
1a610 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
1a620 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
1a630 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
1a640 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
1a650 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
1a660 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
1a670 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
1a680 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
1a690 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
1a6a0 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
1a6b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a6c0 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
1a6d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1a6e0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1a6f0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1a700 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1a710 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1a720 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1a730 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1a740 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1a750 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1a760 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1a770 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1a780 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1a790 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1a7a0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1a7b0 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
1a7c0 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20  /* Existance of 
1a7d0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1a7e0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1a7f0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
1a800 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
1a810 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
1a820 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
1a830 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
1a840 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1a850 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1a860 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1a870 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1a880 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1a890 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1a8a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1a8b0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1a8c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1a8d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1a8e0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1a8f0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
1a900 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1a910 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1a920 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1a930 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1a940 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1a950 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1a960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1a970 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1a980 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a990 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1a9a0 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  rse, 1);.      b
1a9b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a9c0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1a9d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1a9e0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1a9f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1aa00 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1aa10 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1aa20 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1aa30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa40 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1aa50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1aa60 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1aa70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1aa80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1aa90 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1aaa0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1aab0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1aac0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1aad0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1aae0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1aaf0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1ab00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ab10 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1ab20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1ab30 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1ab40 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1ab50 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1ab60 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1ab70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ab80 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
1ab90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1aba0 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
1abb0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
1abc0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
1abd0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
1abe0 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
1abf0 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
1ac00 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
1ac10 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
1ac20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ac30 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
1ac40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ac50 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
1ac60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ac70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
1ac80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ac90 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
1aca0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
1acb0 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
1acc0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
1acd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ace0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1acf0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1ad00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1ad10 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1ad20 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1ad30 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1ad40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1ad50 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1ad60 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1ad70 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
1ad80 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1ad90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1ada0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1adb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1adc0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1add0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ade0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1adf0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1ae00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ae10 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1ae20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ae30 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1ae40 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1ae50 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ae60 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
1ae70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ae80 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
1ae90 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1aea0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1aeb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1aec0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1aed0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1aee0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1aef0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1af00 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1af10 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
1af20 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1af30 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
1af40 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1af50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1af60 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1af70 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1af80 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1af90 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1afa0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1afb0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1afc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1afd0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1afe0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1aff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b000 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1b010 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1b020 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1b030 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1b040 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
1b050 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1b060 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1b070 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b080 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1b090 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b0a0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
1b0b0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1b0c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1b0d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1b0e0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1b0f0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1b100 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b110 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
1b120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1b130 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1b140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1b160 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1b170 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1b180 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1b190 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1b1a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1b1b0 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1b1c0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1b1d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1b1e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1b1f0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1b200 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1b210 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1b220 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b230 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1b240 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1b250 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1b260 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1b270 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b280 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1b290 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1b2a0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1b2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b2c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b2d0 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
1b2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1b2f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1b300 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1b310 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b320 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1b330 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
1b340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b350 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1b360 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1b370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b380 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1b390 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1b3a0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1b3b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1b3c0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1b3d0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1b3e0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1b3f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b400 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1b410 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b420 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1b430 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1b440 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1b450 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
1b460 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1b470 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1b480 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1b490 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1b4a0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1b4b0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1b4c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1b4d0 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
1b4e0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1b4f0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1b500 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b510 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1b520 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1b530 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1b540 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1b550 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
1b560 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
1b570 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
1b580 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
1b590 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
1b5a0 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
1b5b0 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
1b5c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
1b5d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1b5e0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1b5f0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1b600 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1b610 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1b620 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1b630 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1b640 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1b650 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1b660 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1b670 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1b680 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1b690 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1b6a0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1b6b0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
1b6c0 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
1b6d0 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1b6e0 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
1b6f0 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
1b700 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
1b710 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
1b720 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
1b730 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
1b740 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1b750 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
1b760 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
1b770 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
1b780 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1b790 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
1b7a0 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
1b7b0 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
1b7c0 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
1b7d0 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
1b7e0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1b7f0 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
1b800 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
1b810 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
1b820 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
1b830 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
1b840 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
1b850 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
1b860 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1b870 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1b880 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
1b890 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
1b8a0 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
1b8b0 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
1b8c0 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
1b8d0 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
1b8e0 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
1b8f0 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
1b900 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
1b910 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1b920 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
1b930 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
1b940 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
1b950 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
1b960 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
1b970 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
1b980 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
1b990 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
1b9a0 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
1b9b0 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
1b9c0 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
1b9d0 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
1b9e0 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
1b9f0 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
1ba00 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
1ba10 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
1ba20 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
1ba30 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ba40 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
1ba50 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
1ba60 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1ba70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
1ba80 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
1ba90 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
1baa0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1bab0 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
1bac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1bad0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
1bae0 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
1baf0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1bb00 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
1bb10 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
1bb20 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1bb30 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
1bb40 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1bb50 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
1bb60 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
1bb70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1bb80 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
1bb90 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
1bba0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1bbb0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1bbc0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
1bbd0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1bbe0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1bbf0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1bc00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bc10 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1bc20 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1bc30 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1bc40 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1bc50 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1bc60 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1bc70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bc80 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1bc90 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1bca0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1bcb0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1bcc0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1bcd0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1bce0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bcf0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1bd00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1bd10 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1bd20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1bd30 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1bd40 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1bd50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bd60 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1bd70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1bd80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1bd90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bda0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1bdb0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1bdc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1bdd0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1bde0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bdf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1be00 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1be10 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1be20 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1be30 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1be40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1be50 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1be60 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1be70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1be80 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1be90 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1bea0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1beb0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1bec0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1bed0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1bee0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1bef0 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1bf00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1bf10 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1bf20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1bf30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bf40 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1bf50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1bf60 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1bf70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1bf80 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1bf90 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1bfa0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1bfb0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1bfc0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1bfd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1bfe0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1bff0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1c000 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1c010 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1c020 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1c030 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1c040 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1c050 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1c060 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1c070 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1c080 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1c090 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1c0a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1c0b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c0c0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1c0d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c0e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c0f0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1c100 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1c110 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1c120 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
1c130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c140 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1c150 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1c160 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c170 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1c180 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1c190 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1c1a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c1b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1c1c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1c1d0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1c1e0 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
1c1f0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
1c200 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f   TK_EQ;.      co
1c210 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1c220 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1c230 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1c240 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1c250 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1c260 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1c270 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c280 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1c290 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c2a0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1c2b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c2c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c2d0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1c2e0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1c2f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1c300 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1c310 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c320 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1c330 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1c340 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c350 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c360 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1c370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1c390 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1c3a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1c3b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1c3c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c3d0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1c3e0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1c3f0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1c400 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1c410 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1c420 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1c430 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 0, jumpIfNull)
1c440 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c450 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c460 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1c470 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1c480 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
1c490 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
1c4a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c4b0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1c4c0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
1c4d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c4e0 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
1c4f0 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
1c500 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1c510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c520 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1c530 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1c540 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1c550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c560 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1c570 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1c580 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1c590 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c5a0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1c5b0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1c5c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c5d0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1c5e0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1c5f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c600 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1c610 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1c620 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1c630 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1c640 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1c650 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1c660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1c670 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1c680 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c690 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1c6a0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1c6b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1c6c0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1c6d0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
1c6e0 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
1c6f0 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
1c700 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
1c710 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
1c720 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
1c730 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
1c740 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
1c750 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
1c760 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
1c770 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
1c780 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
1c790 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
1c7a0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1c7b0 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
1c7c0 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
1c7d0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
1c7e0 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  r..**.** Sometim
1c7f0 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
1c800 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
1c810 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
1c820 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
1c830 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
1c840 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
1c850 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
1c860 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1c870 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
1c880 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
1c890 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
1c8a0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
1c8b0 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
1c8c0 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
1c8d0 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
1c8e0 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
1c8f0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1c900 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
1c910 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
1c920 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
1c930 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
1c940 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
1c950 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
1c960 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
1c970 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
1c980 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1c990 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
1c9a0 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
1c9b0 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
1c9c0 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
1c9d0 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
1c9e0 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
1c9f0 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
1ca00 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
1ca10 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
1ca20 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
1ca30 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1ca40 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
1ca50 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
1ca60 7b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70  {.  if( pA==0||p
1ca70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
1ca80 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
1ca90 32 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  2;.  }.  assert(
1caa0 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1cab0 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65  erty(pA, EP_Toke
1cac0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1cad0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
1cae0 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1caf0 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f  ty(pB, EP_TokenO
1cb00 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1cb10 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
1cb20 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1cb30 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78  xIsSelect) || Ex
1cb40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1cb50 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1cb60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  ){.    return 2;
1cb70 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
1cb80 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1cb90 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
1cba0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
1cbb0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1cbc0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
1cbd0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1cbe0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
1cbf0 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
1cc00 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65   pB->pLeft) ) re
1cc10 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71  turn 2;.  if( sq
1cc20 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1cc30 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
1cc40 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
1cc50 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 2;.  if( sqlit
1cc60 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
1cc70 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
1cc80 42 2d 3e 78 2e 70 4c 69 73 74 29 20 29 20 72 65  B->x.pList) ) re
1cc90 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41  turn 2;.  if( pA
1cca0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
1ccb0 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
1ccc0 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
1ccd0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1cce0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1ccf0 74 79 28 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pA, EP_IntVal
1cd00 75 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ue) ){.    if( !
1cd10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1cd20 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pB, EP_IntValue)
1cd30 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   || pA->u.iValue
1cd40 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  !=pB->u.iValue )
1cd50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  {.      return 2
1cd60 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1cd70 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
1cd80 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a  OLUMN && pA->u.z
1cd90 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
1cda0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1cdb0 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pB, EP_IntValue
1cdc0 29 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75  ) || NEVER(pB->u
1cdd0 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65  .zToken==0) ) re
1cde0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
1cdf0 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
1ce00 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
1ce10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
1ce20 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1ce30 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
1ce40 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
1ce50 74 65 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  te)!=(pB->flags 
1ce60 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
1ce70 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1ce80 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
1ce90 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d  EP_ExpCollate)!=
1cea0 30 20 26 26 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d  0 && pA->pColl!=
1ceb0 70 42 2d 3e 70 43 6f 6c 6c 20 29 20 72 65 74 75  pB->pColl ) retu
1cec0 72 6e 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 2;.  return 0
1ced0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
1cee0 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
1cef0 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
1cf00 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
1cf10 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
1cf20 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
1cf30 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
1cf40 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  way..**.** This 
1cf50 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1cf60 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
1cf70 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
1cf80 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
1cf90 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
1cfa0 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
1cfb0 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
1cfc0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
1cfd0 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
1cfe0 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
1cff0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
1d000 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
1d010 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
1d020 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
1d030 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
1d040 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
1d050 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
1d060 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
1d070 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
1d080 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
1d090 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
1d0a0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
1d0b0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
1d0c0 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
1d0d0 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
1d0e0 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
1d0f0 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
1d100 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
1d110 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
1d120 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
1d130 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
1d140 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
1d150 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
1d160 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
1d170 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1d180 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
1d190 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
1d1a0 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
1d1b0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1d1c0 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
1d1d0 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
1d1e0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
1d1f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
1d200 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1d210 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72  re(pExprA, pExpr
1d220 42 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  B) ) return 1;. 
1d230 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1d240 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
1d250 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1d260 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1d270 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
1d280 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
1d290 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
1d2a0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
1d2b0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
1d2c0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
1d2d0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
1d2e0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
1d2f0 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
1d300 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
1d310 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
1d320 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
1d330 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
1d340 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
1d350 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
1d360 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
1d370 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  l[0]),.       3,
1d380 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
1d390 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
1d3a0 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41  &pInfo->nColumnA
1d3b0 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
1d3c0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
1d3d0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
1d3e0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1d3f0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
1d400 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
1d410 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1d420 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
1d430 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
1d440 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1d450 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
1d460 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
1d470 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
1d480 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
1d490 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
1d4a0 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
1d4b0 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
1d4c0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1d4d0 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
1d4e0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
1d4f0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
1d500 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
1d510 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20         3,.      
1d520 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
1d530 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
1d540 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  FuncAlloc,.     
1d550 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
1d560 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
1d570 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
1d580 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
1d590 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
1d5a0 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
1d5b0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
1d5c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1d5d0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
1d5e0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1d5f0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
1d600 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1d610 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
1d620 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
1d630 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
1d640 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
1d650 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
1d660 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
1d670 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
1d680 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
1d690 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
1d6a0 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
1d6b0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
1d6c0 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
1d6d0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1d6e0 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
1d6f0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
1d700 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1d710 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1d720 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1d730 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
1d740 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1d750 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1d760 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d770 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1d780 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
1d790 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1d7a0 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
1d7b0 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
1d7c0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
1d7d0 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
1d7e0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
1d7f0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
1d800 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
1d810 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
1d820 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
1d830 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1d840 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
1d850 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1d860 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
1d870 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1d880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
1d890 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1d8a0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
1d8b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1d8c0 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
1d8d0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1d8e0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1d8f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
1d900 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
1d910 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
1d920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1d930 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1d940 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
1d950 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
1d960 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
1d970 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1d980 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
1d990 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
1d9a0 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
1d9c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
1d9d0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
1d9e0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
1d9f0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
1da00 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
1da10 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
1da20 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
1da30 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
1da40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1da50 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
1da60 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
1da70 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
1da80 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
1da90 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
1daa0 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
1dab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1dac0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
1dad0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
1dae0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1daf0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
1db00 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
1db10 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
1db20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1db30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1db40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1db50 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
1db60 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1db70 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
1db80 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
1db90 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
1dba0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
1dbb0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
1dbc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1dbd0 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
1dbe0 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
1dbf0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1dc00 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
1dc10 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
1dc20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
1dc30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1dc50 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
1dc60 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1dc80 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
1dc90 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
1dca0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1dcb0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1dcd0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
1dce0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1dcf0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
1dd00 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1dd20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
1dd30 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1dd40 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
1dd50 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
1dd60 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1dd70 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1dd80 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
1ddd0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1ddf0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
1de00 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
1de10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
1de20 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1de30 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
1de40 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
1de70 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
1de80 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
1de90 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1dea0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
1deb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dec0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1dee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1def0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1df00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1df10 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
1df20 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1df40 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1df50 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
1df60 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1df80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1df90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dfa0 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
1dfb0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
1dfc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1dfd0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
1dfe0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
1dff0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
1e000 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
1e010 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
1e020 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
1e030 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
1e040 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
1e050 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
1e060 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
1e070 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
1e080 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
1e090 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
1e0a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
1e0b0 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
1e0c0 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
1e0d0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
1e0e0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
1e0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1e100 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
1e110 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
1e120 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
1e130 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
1e140 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e150 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
1e160 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
1e170 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
1e180 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
1e190 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
1e1a0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
1e1b0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1e1c0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
1e1d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1e1e0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1e1f0 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e     /* The pNC->n
1e200 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61  Depth==0 test ca
1e210 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1e220 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71  unctions in subq
1e230 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20  ueries.      ** 
1e240 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f  to be ignored */
1e250 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
1e260 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20  nDepth==0 ){.   
1e270 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
1e280 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
1e290 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
1e2a0 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
1e2b0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
1e2c0 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
1e2d0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
1e2e0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
1e2f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e300 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1e310 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
1e320 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
1e330 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1e340 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1e350 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
1e360 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1e370 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
1e380 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
1e390 70 72 2c 20 70 45 78 70 72 29 3d 3d 30 20 29 7b  pr, pExpr)==0 ){
1e3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1e3b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1e3c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e3d0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
1e3e0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
1e3f0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
1e400 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
1e410 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
1e420 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
1e430 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
1e440 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
1e450 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
1e460 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
1e470 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
1e480 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
1e490 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
1e4a0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
1e4b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e4c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e4d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1e4e0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
1e4f0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
1e500 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1e510 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
1e520 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
1e530 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1e540 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
1e550 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1e560 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1e570 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e580 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e590 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e5a0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
1e5b0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
1e5c0 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
1e5d0 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
1e5e0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e5f0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74  >u.zToken, sqlit
1e600 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
1e610 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20  ->u.zToken),.   
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f  pExpr->x.pList ?
1e640 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1e650 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
1e660 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1e670 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1e680 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
1e690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e6a0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
1e6b0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
1e6c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1e6d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e6e0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
1e6f0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1e700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e720 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
1e730 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
1e740 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
1e750 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
1e760 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
1e770 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1e780 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
1e790 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e7a0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1e7b0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
1e7c0 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
1e7d0 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20  ble(pExpr);.    
1e7e0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
1e7f0 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
1e800 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
1e810 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
1e820 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1e830 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
1e840 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e850 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1e860 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
1e870 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
1e880 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
1e890 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1e8a0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d  *pSelect){.  Nam
1e8b0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
1e8c0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
1e8d0 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
1e8e0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d  h==0 ){.    pNC-
1e8f0 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73  >nDepth++;.    s
1e900 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1e910 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63  (pWalker, pSelec
1e920 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65  t);.    pNC->nDe
1e930 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  pth--;.    retur
1e940 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
1e950 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1e960 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
1e970 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c   }.}../*.** Anal
1e980 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
1e990 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
1e9a0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
1e9b0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
1e9c0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
1e9d0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
1e9e0 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
1e9f0 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
1ea00 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
1ea10 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
1ea20 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
1ea30 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
1ea40 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
1ea50 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1ea60 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
1ea70 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
1ea80 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
1ea90 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
1eaa0 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
1eab0 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
1eac0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1ead0 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
1eae0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
1eaf0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
1eb00 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
1eb10 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
1eb20 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
1eb30 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1eb40 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
1eb50 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
1eb60 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
1eb70 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
1eb80 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
1eb90 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
1eba0 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
1ebb0 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
1ebc0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1ebd0 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
1ebe0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
1ebf0 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
1ec00 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
1ec10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1ec20 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
1ec30 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
1ec40 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
1ec50 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
1ec60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1ec70 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
1ec80 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
1ec90 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1eca0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
1ecb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ecc0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1ecd0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1ece0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
1ecf0 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
1ed00 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
1ed10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
1ed20 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1ed30 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
1ed40 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1ed50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ed60 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
1ed70 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
1ed80 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
1ed90 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
1eda0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
1edb0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1edc0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
1edd0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
1ede0 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
1edf0 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
1ee00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
1ee10 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
1ee20 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
1ee30 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
1ee40 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1ee50 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
1ee60 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
1ee70 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
1ee80 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
1ee90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
1eea0 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
1eeb0 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
1eec0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
1eed0 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
1eee0 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  dallocation is d
1eef0 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
1ef00 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
1ef10 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
1ef20 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
1ef30 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
1ef40 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
1ef50 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
1ef60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1ef70 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
1ef80 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
1ef90 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1efa0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
1efb0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1efc0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1efd0 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
1efe0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1eff0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
1f000 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
1f010 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
1f020 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
1f030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
1f040 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
1f050 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1f060 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
1f070 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1f080 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1f090 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
1f0a0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1f0b0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
1f0c0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
1f0d0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1f0e0 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
1f0f0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1f100 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1f110 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
1f120 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
1f130 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
1f140 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
1f150 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
1f160 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
1f170 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
1f180 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
1f190 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
1f1a0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
1f1b0 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
1f1c0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1f1d0 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
1f1e0 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
1f1f0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1f200 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1f210 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
1f220 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
1f230 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f240 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
1f250 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
1f260 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74  t nReg){.  sqlit
1f270 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1f280 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
1f290 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
1f2a0 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
1f2b0 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
1f2c0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
1f2d0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
1f2e0 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
1f2f0 67 3b 0a 20 20 7d 0a 7d 0a                       g;.  }.}.