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

Artifact 1c351f385950a40b0283328eb925641a3aa50a84:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
0c10: 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  op;.    pColl = 
0c20: 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  p->pColl;.    if
0c30: 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ( pColl ) break;
0c40: 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  .    op = p->op;
0c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
0c60: 21 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  !=0 && (.       
0c70: 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55   op==TK_AGG_COLU
0c80: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c  MN || op==TK_COL
0c90: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  UMN || op==TK_RE
0ca0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
0cb0: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 29 29 7b  _TRIGGER.    )){
0cc0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
0cd0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0ce0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0cf0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0d00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
0d10: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0d20: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0d30: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0d40: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0d50: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ster */.      co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
0d80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
0d90: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
0da0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
0db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0dc0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70         zColl = p
0dd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0de0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0df0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0e00: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0e10: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0e20: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
0e30: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
0e60: 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26  f( op!=TK_CAST &
0e70: 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29  & op!=TK_UPLUS )
0e80: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
0e90: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
0ea0: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
0eb0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0ec0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0ed0: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0ee0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0ef0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0f00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
0f10: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
0f20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0f30: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
0f40: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0f50: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
0f60: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
0f70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
0f80: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0f90: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0fa0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
0fb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0fc0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
0fd0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0fe0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
0ff0: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1000: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1010: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1020: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
1030: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
1040: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
1050: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
1060: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
1070: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1080: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1090: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
10a0: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
10b0: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
10c0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
10d0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
10e0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
10f0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1100: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1120: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
1130: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1160: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
1170: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1180: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1190: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11a0: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
11b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
11c0: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
11d0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
11e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
11f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1200: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1210: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
1220: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
1230: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
1240: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1250: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
1260: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
1270: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1290: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
12a0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
12b0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
12c0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
12d0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
12e0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
12f0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1300: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1310: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1320: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
1330: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
1340: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
1350: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1360: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
1370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1380: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1390: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
13a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
13b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
13c0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
13d0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
13e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
13f0: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1400: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1410: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1430: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
1440: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1450: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
1460: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
1470: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1480: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1490: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
14b0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
14c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
14f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1500: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1510: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
1520: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
1530: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
1540: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
1550: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
1560: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
1570: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1580: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1590: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
15a0: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
15b0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
15c0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
15d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
15e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
15f0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1600: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1610: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
1620: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
1630: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1640: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
1650: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
1660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1670: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1680: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1690: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
16a0: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
16b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
16c0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
16d0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
16e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1700: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1710: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
1720: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
1730: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1740: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
1750: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1760: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
1770: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1780: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a0: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
17b0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
17c0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
17d0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
17e0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
17f0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1800: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1810: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1820: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1830: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1840: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1850: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1860: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1870: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1880: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1890: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
18a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
18b0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
18c0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
18d0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1910: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1920: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1930: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1940: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1950: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1960: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1970: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1980: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1990: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19a0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
19b0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
19c0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
19d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
19e0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
19f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1a00: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1a10: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1a20: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1a30: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1a40: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1a50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1a60: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1a70: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1a80: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1a90: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1aa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1ab0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1ac0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ad0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1af0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1b00: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1b10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b20: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1b40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1b50: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b60: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1b70: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1b80: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1b90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ba0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1bb0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1bc0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1bd0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1be0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1c10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1c20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1c30: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1c40: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1c50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1c90: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1ca0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1cc0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1cd0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cf0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1d00: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1d10: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1d20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1d30: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d50: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1d80: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1d90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1da0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1db0: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
1dc0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1dd0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
1de0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1df0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e00: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
1e10: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1e20: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
1e30: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
1e40: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
1e50: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
1e60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
1e70: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
1e80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1e90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1ea0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1eb0: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
1ec0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
1ed0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
1ee0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
1f10: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
1f20: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
1f50: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
1f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f70: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
1f80: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
1f90: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1fa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1fb0: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1fc0: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fd0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fe0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1ff0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2010: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2020: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2030: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2040: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2060: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2080: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
20b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
20c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20e0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20f0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2100: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2110: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2120: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2130: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2140: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2150: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2180: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
21a0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
21b0: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
21c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21d0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21e0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2200: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2210: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2220: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2230: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2240: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2250: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2260: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2270: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2280: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2290: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22a0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
22b0: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
22c0: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22d0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22e0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22f0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2310: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2340: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2350: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2360: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2370: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2380: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2390: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
23a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
23c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2400: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2410: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2440: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2450: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2460: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24a0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
24b0: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
24c0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24d0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24e0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24f0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2500: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2510: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2520: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2530: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2540: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2550: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2560: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2570: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2580: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2590: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
25a0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
25b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
25c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25d0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2600: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2610: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2620: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2630: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2640: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2650: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2660: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2670: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2680: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2690: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
26a0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
26b0: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
26c0: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26d0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2700: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2710: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2720: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2730: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2740: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2760: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2770: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2780: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2790: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
27a0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
27b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
27c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27e0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27f0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2800: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2810: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2820: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2830: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2840: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2850: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2860: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2870: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2880: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2890: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
28a0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
28b0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
28c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28d0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28e0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28f0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2910: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2920: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2940: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2950: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2960: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2970: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2980: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2990: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
29a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
29c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2a10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2a20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a70: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a80: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a90: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2aa0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2ab0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2ac0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ad0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ae0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2af0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2b00: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2b10: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2b20: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ba0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2bb0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2bc0: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2bd0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2be0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bf0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2c00: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2c10: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2c20: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c30: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c40: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c50: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c60: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c70: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c80: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c90: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2ca0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2cb0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2cc0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2cd0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cf0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2d00: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2d10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2d20: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d30: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d40: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d50: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d60: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d70: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d80: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d90: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2da0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2db0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2dc0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2dd0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2de0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2df0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2e00: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2e10: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2e20: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e30: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e40: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e50: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e60: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e80: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ea0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2eb0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ee0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ef0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2f00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2f10: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2f20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f30: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f50: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f60: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f70: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f80: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2fa0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2fb0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2fc0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fd0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fe0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2ff0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3000: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3010: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3020: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3060: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3070: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3080: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3090: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
30a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
30b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
30d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
30e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
30f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3100: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3110: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3130: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3140: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3150: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3160: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3170: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3180: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3190: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31a0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
31b0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
31c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
31d0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31e0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31f0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3200: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3210: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3220: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3230: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3240: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3250: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3260: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3280: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3290: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
32a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
32b0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
32c0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
32d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32e0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32f0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3300: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3310: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3330: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3340: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3350: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3360: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3370: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3380: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3390: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
33a0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
33b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
33d0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33f0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3400: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3420: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3440: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3450: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3460: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3470: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3480: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3490: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
34a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34b0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
34c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
34d0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34e0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34f0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3500: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3510: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3520: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3530: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3540: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3550: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3560: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3570: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3580: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3590: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
35a0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
35b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
35c0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
35d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35e0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3600: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3610: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3640: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3650: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3670: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3680: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3690: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
36a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
36b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
36c0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
36d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36e0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36f0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3700: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3730: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3750: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3760: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3780: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3790: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
37a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
37b0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
37c0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
37d0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37e0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37f0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3800: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3820: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3830: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3840: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3850: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3860: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3870: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3880: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3890: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
38a0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
38b0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
38c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
38d0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38e0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38f0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3900: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3910: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3920: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3940: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3950: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3960: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3970: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3980: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3990: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
39a0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
39b0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
39c0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
39d0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39e0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39f0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3a00: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3a10: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3a20: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
3a30: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
3a40: 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b   op, pToken, 1);
3a50: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  .  sqlite3ExprAt
3a60: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3a70: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3a80: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 69 66  t, pRight);.  if
3a90: 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  ( p ) {.    sqli
3aa0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
3ab0: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
3ac0: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65  eight);.  }.  re
3ad0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3ae0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3af0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3b00: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3b10: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3b20: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3b30: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3b40: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3b50: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
3b60: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
3b70: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3b80: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
3b90: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
3ba0: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
3bb0: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
3bc0: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
3bd0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3be0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeft;.  }else{.
3bf0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
3c00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3c10: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
3c20: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3c30: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3c40: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
3c50: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
3c60: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
3c70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
3c80: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
3c90: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
3ca0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
3cb0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
3cc0: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
3cd0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
3ce0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
3cf0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
3d00: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
3d10: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
3d20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3d30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
3d40: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
3d50: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3d60: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
3d70: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
3d80: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
3d90: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
3da0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3db0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
3dc0: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
3dd0: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
3de0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
3df0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
3e00: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
3e10: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
3e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
3e30: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
3e40: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
3e50: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
3e60: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
3e70: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3e80: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
3e90: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
3ea0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
3eb0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
3ec0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
3ed0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
3ee0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
3ef0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
3f00: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
3f10: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
3f20: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
3f30: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
3f40: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
3f50: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f60: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
3f70: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
3f80: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
3f90: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
3fa0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
3fb0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
3fc0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
3fd0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
3fe0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
3ff0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
4000: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
4010: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
4020: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4030: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4040: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4050: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4060: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4070: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4080: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4090: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
40a0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
40b0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
40c0: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
40d0: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
40e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
40f0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
4100: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
4110: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
4120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4130: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
4140: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4150: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
4160: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
4170: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4180: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
4190: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
41a0: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
41b0: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
41c0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
41d0: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
41e0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
41f0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
4200: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
4210: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20  if( z[1]==0 ){. 
4220: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4230: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
4240: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
4250: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4260: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
4270: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20  z[0]=='?' );.   
4280: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4290: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
42a0: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c  se->nVar);.  }el
42b0: 73 65 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20  se{.    ynVar x 
42c0: 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d  = 0;.    u32 n =
42d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
42e0: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  (z);.    if( z[0
42f0: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
4300: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
4310: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
4320: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
4330: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
4340: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74  .      ** use it
4350: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
4360: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
4370: 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e   i64 i;.      in
4380: 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74  t bOk = 0==sqlit
4390: 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20  e3Atoi64(&z[1], 
43a0: 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f  &i, n-1, SQLITE_
43b0: 55 54 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78  UTF8);.      pEx
43c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
43d0: 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20  = (ynVar)i;.    
43e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
43f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4400: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
4410: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
4420: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4430: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4440: 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20  NUMBER]-1 );.   
4450: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
4460: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4470: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4480: 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20  _NUMBER] );.    
4490: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20    if( bOk==0 || 
44a0: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
44b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
44c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
44d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
44e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
44f0: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
4500: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
4510: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
4520: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ",.            d
4530: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4540: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4550: 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20  NUMBER]);.      
4560: 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    x = 0;.      }
4570: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 70 50 61  .      if( i>pPa
4580: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
4590: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
45a0: 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20  r = (int)i;.    
45b0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
45c0: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
45d0: 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22  s like ":aaa", "
45e0: 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e  $aaa" or "@aaa".
45f0: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
4600: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
4610: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
4620: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
4630: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
4640: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
4650: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  me.      ** has 
4660: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
4670: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
4680: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
4690: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20  umber.      */. 
46a0: 20 20 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20       ynVar i;.  
46b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
46c0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b  Parse->nzVar; i+
46d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
46e0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d  pParse->azVar[i]
46f0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 61 72 73   && memcmp(pPars
4700: 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a 2c 6e 2b  e->azVar[i],z,n+
4710: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
4720: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
4730: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
4740: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
4750: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
4760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4770: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
4780: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4790: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
47a0: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
47b0: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
47c0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
47d0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
47e0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
47f0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
4800: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
4810: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
4820: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
4830: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65     if( a==0 ) re
4840: 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20  turn;  /* Error 
4850: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
4860: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4870: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61  d */.        pPa
4880: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
4890: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
48a0: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
48b0: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
48c0: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
48d0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
48e0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
48f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4900: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
4910: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
4920: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
4930: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4940: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4950: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
4960: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
4970: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
4980: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
4990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
49a0: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
49b0: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
49c0: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
49d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
49e0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
49f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4a10: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
4a20: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
4a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4a40: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4a50: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4a60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4a70: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4a80: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4a90: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4aa0: 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  urn;.  /* Sanity
4ab0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
4ac0: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
4ad0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
4ae0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
4af0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
4b00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4b10: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
4b20: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
4b30: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
4b40: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
4b50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
4b60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4b70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66  lete(db, p->pLef
4b80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4b90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4ba0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
4bb0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
4bc0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
4bd0: 29 20 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20  ) && (p->flags2 
4be0: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
4bf0: 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
4c00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4c10: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
4c20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45  .    }.    if( E
4c30: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4c40: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
4c50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4c60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4c70: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
4c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4ca0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
4cb0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
4cc0: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
4cd0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
4ce0: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
4cf0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4d00: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
4d10: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
4d20: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
4d30: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
4d40: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
4d50: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
4d60: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4d70: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
4d80: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
4d90: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
4da0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
4db0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
4dc0: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
4dd0: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
4de0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
4df0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4e00: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
4e10: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
4e20: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
4e30: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4e40: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
4e50: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
4e60: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
4e70: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
4e80: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
4e90: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
4ea0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
4eb0: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
4ec0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
4ed0: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
4ee0: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
4ef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
4f00: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
4f10: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
4f20: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
4f30: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
4f40: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
4f50: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
4f60: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
4f70: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
4f80: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
4f90: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
4fa0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
4fb0: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
4fc0: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
4fd0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
4fe0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
4ff0: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
5000: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
5010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5060: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5070: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5080: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5090: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
50a0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
50b0: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
50c0: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
50d0: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
50e0: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
50f0: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
5100: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
5110: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
5120: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
5130: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5140: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5150: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5160: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5170: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5180: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5190: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
51a0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
51b0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
51c0: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
51d0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
51e0: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
51f0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
5200: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
5210: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
5220: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
5230: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5240: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5250: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5260: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5270: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5280: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5290: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
52a0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
52b0: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
52c0: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
52d0: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
52e0: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
52f0: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
5300: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
5310: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
5320: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
5330: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5340: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5350: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5360: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5370: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5380: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5390: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
53a0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
53b0: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
53c0: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
53d0: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
53e0: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
53f0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
5400: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
5410: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
5420: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
5430: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5440: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5450: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5460: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5470: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5480: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5490: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
54a0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
54b0: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
54c0: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
54d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
54e0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
54f0: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
5500: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
5510: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5520: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5530: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5540: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5550: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5560: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5570: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5580: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5590: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69  e allowed */.  i
55a0: 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50  f( 0==(flags&EXP
55b0: 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a  RDUP_REDUCE) ){.
55c0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
55d0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
55e0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
55f0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
5600: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
5610: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
5620: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
5630: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5640: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
5650: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
5660: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5670: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d  _MallocedToken)=
5680: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
5690: 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  ( (p->flags2 & E
56a0: 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d  P2_Irreducible)=
56b0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
56c0: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69  >pLeft || p->pRi
56d0: 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20  ght || p->pColl 
56e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
56f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
5700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
5720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
5730: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
5740: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5750: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
5760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
5770: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
5780: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
5790: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
57a0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
57b0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
57c0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
57d0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
57e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
57f0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
5800: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
5810: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
5820: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
5830: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5840: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5850: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5860: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
5870: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
5880: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
5890: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
58a0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
58b0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
58c0: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
58d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
58e0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
58f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
5900: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
5910: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5920: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5930: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
5940: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
5950: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
5960: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
5970: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5980: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
5990: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
59a0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
59b0: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
59c0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
59d0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
59e0: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
59f0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
5a00: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
5a10: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
5a20: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
5a30: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
5a40: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
5a50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
5a60: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
5a70: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
5a80: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
5a90: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
5aa0: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
5ab0: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
5ac0: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
5ad0: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
5ae0: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
5af0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
5b00: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
5b10: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
5b20: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
5b30: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
5b40: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
5b50: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
5b60: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
5b70: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5b80: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
5b90: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
5ba0: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
5bb0: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
5bc0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5bd0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
5be0: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
5bf0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
5c00: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
5c10: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
5c20: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
5c30: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
5c40: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
5c50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5c60: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
5c70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5c80: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
5c90: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
5ca0: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
5cb0: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
5cc0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
5cd0: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
5ce0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
5cf0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
5d00: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
5d10: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
5d20: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
5d30: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
5d40: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
5d50: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
5d60: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
5d70: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
5d80: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
5d90: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
5da0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
5db0: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
5dc0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
5dd0: 74 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a  te passed the.**
5de0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5df0: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
5e00: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
5e10: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
5e20: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
5e30: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
5e40: 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38  p, int flags, u8
5e50: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
5e60: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20  Expr *pNew = 0; 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
5e90: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28   return */.  if(
5ea0: 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   p ){.    const 
5eb0: 69 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20  int isReduced = 
5ec0: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
5ed0: 45 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a  EDUCE);.    u8 *
5ee0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20  zAlloc;.    u32 
5ef0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
5f00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42  .    assert( pzB
5f10: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65  uffer==0 || isRe
5f20: 64 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a  duced );..    /*
5f30: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
5f40: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
5f50: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
5f60: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a  e. */.    if( pz
5f70: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
5f80: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
5f90: 65 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  er;.      static
5fa0: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
5fb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5fc0: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
5fd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
5fe0: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
5ff0: 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20  (p, flags));.   
6000: 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45   }.    pNew = (E
6010: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
6020: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
6030: 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77       /* Set nNew
6040: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
6050: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
6060: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
6070: 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  nted to.      **
6080: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
6090: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
60a0: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
60b0: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
60c0: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
60d0: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
60e0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
60f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
6100: 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20  nsumed.      ** 
6110: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
6120: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6130: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
6140: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
6150: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
6160: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
6170: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6180: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
6190: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
61a0: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
61b0: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20  e & 0xfff;.     
61c0: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
61d0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
61e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
61f0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
6200: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
6210: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
6220: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
6230: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
6240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6250: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
6260: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6270: 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20  isReduced ){.   
6280: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
6290: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
62a0: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
62b0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
62c0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
62d0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
62e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
62f0: 6e 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75  nSize = exprStru
6300: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
6310: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
6320: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
6330: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
6340: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
6350: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
6360: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ze);.      }..  
6370: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
6380: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
6390: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
63a0: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
63b0: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
63c0: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
63d0: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
63e0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
63f0: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
6400: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
6410: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
6420: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6430: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e  nOnly);.      pN
6440: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
6450: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20  ticFlag;..      
6460: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
6470: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
6480: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
6490: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
64a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
64b0: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
64c0: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
64d0: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
64e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
64f0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
6500: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
6510: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6520: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
6530: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50  New->flags) & EP
6540: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6550: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
6560: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
6570: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
6580: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
6590: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  /.        if( Ex
65a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
65b0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
65c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
65d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
65e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
65f0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
6600: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
6610: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6620: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
6630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
6640: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
6650: 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63  x.pList, isReduc
6660: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ed);.        }. 
6670: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
6680: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
6690: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
66a0: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  Right. */.      
66b0: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
66c0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
66d0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
66e0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
66f0: 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64   zAlloc += duped
6700: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
6710: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
6720: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
6730: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
6740: 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  uced) ){.       
6750: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
6760: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6770: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
6780: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
6790: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
67a0: 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75  >pRight = exprDu
67b0: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
67c0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
67d0: 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20   &zAlloc);.     
67e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
67f0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
6800: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
6810: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
6820: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6830: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6840: 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20  flags2 = 0;.    
6850: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
6860: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
6870: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6880: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6890: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
68a0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
68b0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
68c0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
68d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
68e0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
68f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
6900: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
6910: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6920: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
6930: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
6940: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
6950: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
6960: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
6970: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
6980: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
6990: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
69a0: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
69b0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
69c0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
69d0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
69e0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
69f0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
6a00: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
6a10: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
6a20: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
6a30: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
6a40: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
6a50: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
6a60: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
6a70: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
6a80: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
6a90: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
6aa0: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
6ab0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
6ac0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
6ad0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
6ae0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
6af0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
6b00: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
6b10: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
6b20: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
6b30: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
6b40: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
6b50: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
6b60: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
6b70: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
6b80: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6b90: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6ba0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6bb0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
6bc0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
6bd0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
6be0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
6bf0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
6c00: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
6c10: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
6c20: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6c30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6c40: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
6c50: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6c60: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
6c70: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
6c80: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
6c90: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
6ca0: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
6cb0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
6cc0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
6cd0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
6ce0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
6cf0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
6d00: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
6d10: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6d20: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
6d30: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
6d40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6d50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
6d60: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
6d70: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
6d80: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
6d90: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
6da0: 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  >iECursor = 0;. 
6db0: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69   pNew->nExpr = i
6dc0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69   = p->nExpr;.  i
6dd0: 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52  f( (flags & EXPR
6de0: 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29  DUP_REDUCE)==0 )
6df0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
6e00: 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20  Expr; i+=i){}.  
6e10: 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20  pNew->a = pItem 
6e20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6e30: 63 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a 65  cRaw(db,  i*size
6e40: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
6e50: 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b   if( pItem==0 ){
6e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6e70: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
6e80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
6e90: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
6ea0: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
6eb0: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
6ec0: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
6ed0: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
6ee0: 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49  pOldExpr = pOldI
6ef0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
6f00: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pItem->pExpr = s
6f10: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6f20: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
6f30: 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  s);.    pItem->z
6f40: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
6f50: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
6f60: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
6f70: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
6f80: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
6f90: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53  db, pOldItem->zS
6fa0: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
6fb0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
6fc0: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
6fd0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
6fe0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d  e = 0;.    pItem
6ff0: 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  ->iOrderByCol = 
7000: 70 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72 64 65 72  pOldItem->iOrder
7010: 42 79 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d  ByCol;.    pItem
7020: 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49  ->iAlias = pOldI
7030: 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d  tem->iAlias;.  }
7040: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7050: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
7060: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
7070: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
7080: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
7090: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
70a0: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
70b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
70c0: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
70d0: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
70e0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
70f0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
7100: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
7110: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
7120: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
7130: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
7140: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
7150: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
7160: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
7170: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
7180: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
7190: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
71a0: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
71b0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
71c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
71d0: 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  cList *p, int fl
71e0: 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  ags){.  SrcList 
71f0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
7200: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
7210: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
7220: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
7230: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
7240: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
7250: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
7260: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
7270: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
7280: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74  llocRaw(db, nByt
7290: 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  e );.  if( pNew=
72a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
72b0: 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e   pNew->nSrc = pN
72c0: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
72d0: 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nSrc;.  for(i=0;
72e0: 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29   i<p->nSrc; i++)
72f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
7300: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
7310: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
7320: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ];.    struct Sr
7330: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  cList_item *pOld
7340: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
7350: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
7360: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7370: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = 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 44 61 74 61 62  pOldItem->zDatab
73a0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
73b0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
73c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
73d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
73e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
73f0: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
7400: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7410: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
7420: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f      pNewItem->jo
7430: 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65  intype = pOldIte
7440: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
7450: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
7460: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
7470: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
7480: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
7490: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
74a0: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
74b0: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
74c0: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
74d0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4e  egReturn;.    pN
74e0: 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c  ewItem->isCorrel
74f0: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
7500: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3b 0a 20  >isCorrelated;. 
7510: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e     pNewItem->zIn
7520: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dex = sqlite3DbS
7530: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7540: 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20  em->zIndex);.   
7550: 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e   pNewItem->notIn
7560: 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  dexed = pOldItem
7570: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20  ->notIndexed;.  
7580: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64    pNewItem->pInd
7590: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
75a0: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20  Index;.    pTab 
75b0: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
75c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
75d0: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
75e0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
75f0: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
7600: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65   pNewItem->pSele
7610: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
7620: 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  ctDup(db, pOldIt
7630: 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61  em->pSelect, fla
7640: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
7650: 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33  m->pOn = sqlite3
7660: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
7670: 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73  Item->pOn, flags
7680: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7690: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
76a0: 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70  3IdListDup(db, p
76b0: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
76c0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
76d0: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
76e0: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
76f0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7700: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
7710: 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74  3IdListDup(sqlit
7720: 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
7730: 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e  p){.  IdList *pN
7740: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
7750: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
7760: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
7770: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7780: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
7790: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
77a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
77b0: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e   pNew->nId = p->
77c0: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
77d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
77e0: 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  Raw(db, p->nId*s
77f0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
7800: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
7810: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7820: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
7830: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7840: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
7850: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
7860: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
7870: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
7880: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
7890: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
78a0: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
78b0: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
78c0: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
78d0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
78e0: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
78f0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
7900: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
7910: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
7920: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
7930: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
7940: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
7950: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
7960: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
7970: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
7980: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
7990: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
79a0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
79b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
79c0: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
79d0: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
79e0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
79f0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
7a00: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
7a10: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
7a20: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7a30: 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70  Select *pNew, *p
7a40: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d  Prior;.  if( p==
7a50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7a60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
7a70: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
7a80: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
7a90: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
7aa0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45  rn 0;.  pNew->pE
7ab0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
7ac0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
7ad0: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
7ae0: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
7af0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
7b00: 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66  p(db, p->pSrc, f
7b10: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7b20: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
7b30: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
7b40: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
7b50: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
7b60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7b70: 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  Dup(db, p->pGrou
7b80: 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  pBy, flags);.  p
7b90: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
7ba0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7bb0: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
7bc0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
7bd0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
7be0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
7bf0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61  p->pOrderBy, fla
7c00: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  gs);.  pNew->op 
7c10: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d  = p->op;.  pNew-
7c20: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
7c30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7c40: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
7c50: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  r, flags);.  if(
7c60: 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
7c70: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
7c80: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
7c90: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
7ca0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7cb0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
7cc0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7cd0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69  ->pOffset = sqli
7ce0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7cf0: 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73  ->pOffset, flags
7d00: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
7d10: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  t = 0;.  pNew->i
7d20: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e  Offset = 0;.  pN
7d30: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
7d40: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
7d50: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
7d60: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
7d70: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
7d80: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
7d90: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
7da0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
7db0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
7dc0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
7dd0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7de0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
7df0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
7e00: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7e10: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
7e20: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
7e30: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
7e40: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
7e50: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
7e60: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
7e70: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
7e80: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
7e90: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
7ea0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
7eb0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
7ec0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
7ed0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
7ee0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
7ef0: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
7f00: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
7f10: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
7f20: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
7f30: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
7f40: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
7f50: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
7f60: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
7f70: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
7f80: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
7f90: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
7fa0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
7fb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7fc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
7fd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7fe0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
8000: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
8010: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
8020: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
8030: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
8040: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
8050: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
8060: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
8070: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8080: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8090: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
80a0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
80b0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
80c0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
80d0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
80e0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
80f0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
8100: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
8110: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8120: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
8130: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
8140: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
8150: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
8160: 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  m;.  }else if( (
8170: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28  pList->nExpr & (
8180: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29  pList->nExpr-1))
8190: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
81a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
81b0: 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *a;.    assert( 
81c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
81d0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
81e0: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
81f0: 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
8200: 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70  nExpr*2*sizeof(p
8210: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
8220: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
8230: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8240: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
8250: 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61  ->a = a;.  }.  a
8260: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
8270: 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b  =0 );.  if( 1 ){
8280: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8290: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
82a0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
82b0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
82c0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
82d0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
82e0: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  ));.    pItem->p
82f0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
8300: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
8310: 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a  ;..no_mem:     .
8320: 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69    /* Avoid leaki
8330: 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ng memory if mal
8340: 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20  loc has failed. 
8350: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
8360: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
8370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
8380: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8390: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
83a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
83b0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
83c0: 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f  .zName element o
83d0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
83e0: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
83f0: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
8400: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8410: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
8420: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
8430: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
8440: 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65   pName should ne
8450: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
8460: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
8470: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
8480: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
8490: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
84a0: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
84b0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
84c0: 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61  istSetName(.  Pa
84d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
84e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
84f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8500: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
8510: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
8520: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
8530: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  e span. */.  Tok
8540: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
8550: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20       /* Name to 
8560: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
8570: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
8580: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
8590: 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20   cause the name 
85a0: 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a  to be dequoted *
85b0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
85c0: 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
85d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
85e0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
85f0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
8600: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8610: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
8620: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
8630: 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  pr>0 );.    pIte
8640: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
8650: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
8660: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
8670: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ->zName==0 );.  
8680: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8690: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
86a0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  p(pParse->db, pN
86b0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
86c0: 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f  );.    if( dequo
86d0: 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61  te && pItem->zNa
86e0: 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  me ) sqlite3Dequ
86f0: 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ote(pItem->zName
8700: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8710: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
8720: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
8730: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
8740: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
8750: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
8760: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
8770: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
8780: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
8790: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
87a0: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
87b0: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
87c0: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
87d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
87e0: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
87f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8800: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
8810: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
8820: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
8830: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
8850: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8860: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8870: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
8880: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
8890: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
88a0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
88b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
88c0: 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64  span to be added
88d0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
88e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
88f0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  b;.  assert( pLi
8900: 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  st!=0 || db->mal
8910: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
8920: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
8930: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8940: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
8950: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
8960: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
8970: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
8980: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73  Expr>0 );.    as
8990: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
89a0: 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d  Failed || pItem-
89b0: 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70  >pExpr==pSpan->p
89c0: 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  Expr );.    sqli
89d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
89e0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
89f0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
8a00: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8a10: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
8a20: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8a50: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
8a60: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
8a70: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
8a80: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
8a90: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
8aa0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
8ab0: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
8ac0: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
8ad0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
8ae0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
8af0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
8b00: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
8b10: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
8b20: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
8b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8b40: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
8b50: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
8b60: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8b70: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
8b80: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
8b90: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
8ba0: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
8bb0: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
8bc0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
8bd0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
8be0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
8bf0: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
8c00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8c10: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8c20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
8c30: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
8c40: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
8c50: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
8c60: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
8c70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8c80: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
8c90: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
8ca0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
8cb0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8cc0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8cd0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
8ce0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
8cf0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
8d00: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
8d10: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
8d20: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
8d30: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8d40: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8d50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8d60: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
8d70: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8d80: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8d90: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
8da0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8db0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8dc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
8dd0: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
8de0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8df0: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
8e00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
8e10: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
8e20: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
8e30: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
8e40: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8e50: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
8e60: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
8e70: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
8e80: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
8e90: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
8ea0: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
8eb0: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
8ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
8ed0: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
8ee0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
8ef0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
8f00: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
8f10: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
8f20: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
8f30: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8f40: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
8f50: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8f60: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
8f70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
8f80: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8f90: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
8fa0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
8fb0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
8fc0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
8fd0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
8fe0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
8ff0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
9000: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
9010: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
9020: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
9030: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
9040: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
9050: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
9060: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
9070: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
9080: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
9090: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
90a0: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
90b0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
90c0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
90d0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
90e0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
90f0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
9100: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9110: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
9120: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
9130: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
9140: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
9150: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
9160: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
9170: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20  pWalker->u.i==2 
9180: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
9190: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
91a0: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
91b0: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
91c0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
91d0: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
91e0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
91f0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
9200: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
9210: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
9220: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
9230: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9240: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
9250: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9260: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9270: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
9280: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9290: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
92a0: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
92b0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
92c0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
92d0: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
92e0: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
92f0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
9300: 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  rt;.    default:
9310: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9320: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
9330: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
9340: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9350: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9360: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9370: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9380: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
9390: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
93a0: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
93b0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
93c0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
93d0: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
93e0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
93f0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
9400: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
9410: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
9420: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
9430: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
9440: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
9450: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
9460: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
9470: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
9480: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
9490: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69  alker w;.  w.u.i
94a0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
94b0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
94c0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
94d0: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
94e0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
94f0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
9500: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
9510: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
9520: 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a  urn w.u.i;.}../*
9530: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9540: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9550: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9560: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9570: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
9580: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9590: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
95a0: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
95b0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
95c0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
95d0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
95e0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
95f0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
9600: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
9610: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
9620: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9630: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
9640: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
9650: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9660: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
9670: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9680: 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a  sConst(p, 1);.}.
9690: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
96a0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
96b0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
96c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
96d0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
96e0: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
96f0: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
9700: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
9710: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
9720: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
9730: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9740: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9750: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
9760: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
9770: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
9780: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9790: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
97a0: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
97b0: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
97c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
97d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
97e0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
97f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9800: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9810: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
9820: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
9830: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
9840: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
9850: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
9860: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
9870: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9880: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9890: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
98a0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
98b0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
98c0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
98d0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
98e0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
98f0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
9900: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
9910: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9920: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9930: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
9940: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
9950: 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 2);.}../*.** 
9960: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9970: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
9980: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
9990: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
99a0: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
99b0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
99c0: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
99d0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
99e0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
99f0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
9a00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9a10: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
9a20: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
9a30: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
9a40: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
9a50: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9a60: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
9a70: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
9a80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9a90: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
9aa0: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
9ab0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
9ac0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
9ad0: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
9ae0: 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
9af0: 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
9b00: 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
9b10: 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
9b20: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
9b30: 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
9b40: 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
9b50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
9b60: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
9b70: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
9b80: 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
9b90: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9ba0: 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
9bb0: 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
9bc0: 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
9bd0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
9be0: 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
9bf0: 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
9c00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9c10: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
9c20: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
9c30: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
9c40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
9c50: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
9c60: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
9c70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9c80: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
9c90: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
9ca0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9cb0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9cc0: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9cd0: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9ce0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9cf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9d10: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
9d20: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
9d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
9d40: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
9d50: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
9d60: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
9d70: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
9d80: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
9d90: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
9da0: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
9db0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9dc0: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
9dd0: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
9de0: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
9df0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
9e00: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
9e10: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
9e20: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
9e30: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
9e40: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
9e50: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
9e60: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
9e70: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
9e80: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
9e90: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
9ea0: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
9eb0: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
9ec0: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
9ed0: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
9ee0: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
9ef0: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
9f00: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
9f10: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
9f20: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
9f30: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
9f40: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
9f50: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
9f60: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
9f70: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
9f80: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
9f90: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
9fa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
9fb0: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
9fc0: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
9fd0: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
9fe0: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
9ff0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
a000: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
a010: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
a020: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
a030: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
a040: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
a050: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
a060: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
a070: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
a080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
a090: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
a0a0: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
a0b0: 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c  rn 0;.    defaul
a0c0: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
a0d0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
a0e0: 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49  Generate an OP_I
a0f0: 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f  sNull instructio
a100: 6e 20 74 68 61 74 20 74 65 73 74 73 20 72 65 67  n that tests reg
a110: 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a  ister iReg and j
a120: 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  umps.** to locat
a130: 69 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68 65  ion iDest if the
a140: 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69   value in iReg i
a150: 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c  s NULL.  The val
a160: 75 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77  ue in iReg .** w
a170: 61 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70  as computed by p
a180: 45 78 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e  Expr.  If we can
a190: 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61   look at pExpr a
a1a0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61  t compile-time a
a1b0: 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  nd.** determine 
a1c0: 74 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65  that it can neve
a1d0: 72 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c  r generate a NUL
a1e0: 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49  L, then the OP_I
a1f0: 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a  sNull operation.
a200: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
a210: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
a220: 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
a230: 4a 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c  Jump(.  Vdbe *v,
a240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a250: 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
a260: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
a270: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
a280: 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65  r,  /* Only gene
a290: 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69  rate OP_IsNull i
a2a0: 66 20 74 68 69 73 20 65 78 70 72 20 63 61 6e 20  f this expr can 
a2b0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
a2c0: 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 20 20   iReg,          
a2d0: 20 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c   /* Test the val
a2e0: 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
a2f0: 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ter for NULL */.
a300: 20 20 69 6e 74 20 69 44 65 73 74 20 20 20 20 20    int iDest     
a310: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
a320: 72 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  re if the value 
a330: 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  is null */.){.  
a340: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
a350: 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20  anBeNull(pExpr) 
a360: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a370: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a380: 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65  sNull, iReg, iDe
a390: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
a3a0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
a3b0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a3c0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
a3d0: 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
a3e0: 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
a3f0: 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
a400: 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
a410: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
a420: 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
a430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a440: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
a450: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
a460: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
a470: 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
a480: 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
a490: 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
a4a0: 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
a4b0: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
a4c0: 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
a4d0: 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
a4e0: 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
a4f0: 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
a500: 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
a510: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
a520: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
a530: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
a540: 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
a550: 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
a560: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20  LITE_AFF_NONE ) 
a570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
a580: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
a590: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
a5a0: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
a5b0: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
a5c0: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
a5d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
a5e0: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
a5f0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
a600: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
a610: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a620: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a630: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
a640: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a650: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
a660: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
a670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
a680: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
a690: 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
a6a0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
a6b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a6c0: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
a6d0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
a6e0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
a6f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
a700: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
a710: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
a720: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
a730: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a740: 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
a750: 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
a760: 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
a770: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
a780: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
a790: 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
a7a0: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
a7b0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
a7c0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
a7d0: 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
a7e0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
a7f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a810: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
a820: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
a830: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
a840: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
a850: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
a860: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
a870: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
a880: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
a890: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
a8a0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a8b0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
a8c0: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
a8d0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a8e0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
a8f0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
a900: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
a910: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a920: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62  rue if we are ab
a930: 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65  le to the IN ope
a940: 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  rator optimizati
a950: 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79  on on a.** query
a960: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
a970: 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53  **       x IN (S
a980: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
a990: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
a9a0: 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61  T... clause is a
a9b0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
a9c0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  he parameter to 
a9d0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  this.** routine.
a9e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63  .**.** The Selec
a9f0: 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
aa00: 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  in has already b
aa10: 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64  een preprocessed
aa20: 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72   and no.** error
aa30: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e  s have been foun
aa40: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
aa50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
aa60: 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  RY.static int is
aa70: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
aa80: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
aa90: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
aaa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
aab0: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
aac0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
aad0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
aae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69             /* ri
aaf0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
ab00: 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f   IN is SELECT */
ab10: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
ab20: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
ab30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
ab40: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
ab50: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
ab60: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
ab70: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
ab80: 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
ab90: 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
aba0: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
abb0: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
abc0: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
abd0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
abe0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
abf0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
ac00: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
ac10: 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
ac20: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
ac30: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
ac40: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
ac50: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
ac60: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
ac70: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
ac80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
ac90: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
aca0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
acb0: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
acc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
acd0: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
ace0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73   clause */.  ass
acf0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
ad00: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
ad10: 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20      /* No LIMIT 
ad20: 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20  means no OFFSET 
ad30: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
ad40: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ad60: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
ad70: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
ad80: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
ad90: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
ada0: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
adb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
adc0: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
add0: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
ade0: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
adf0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
ae00: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
ae10: 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
ae20: 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
ae30: 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
ae40: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
ae50: 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d   if( NEVER(pTab=
ae60: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
ae70: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
ae80: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
ae90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
aea0: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
aeb0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
aec0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
aed0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
aee0: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
aef0: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
af00: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
af10: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
af20: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
af30: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
af40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
af50: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
af60: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20  lt set */.  if( 
af70: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
af80: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
af90: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  N ) return 0; /*
afa0: 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   Result is a col
afb0: 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  umn */.  return 
afc0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
afd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
afe0: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ERY */../*.** Co
aff0: 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e  de an OP_Once in
b000: 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c  struction and al
b010: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
b020: 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72   its flag. Retur
b030: 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73  n the .** addres
b040: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
b050: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  truction..*/.int
b060: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
b070: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
b080: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
b090: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b0a0: 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72  se);      /* Vir
b0b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
b0c0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65  ng coded */.  re
b0d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
b0e0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp1(v, OP_Onc
b0f0: 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65  e, pParse->nOnce
b100: 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ++);.}../*.** Th
b110: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
b120: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
b130: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
b140: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
b150: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
b160: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
b170: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
b180: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
b190: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
b1a0: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
b1b0: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
b1c0: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
b1d0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
b1e0: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
b1f0: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
b200: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
b210: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72  index of the cur
b220: 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  sor opened on th
b230: 65 20 62 2d 74 72 65 65 20 28 64 61 74 61 62 61  e b-tree (databa
b240: 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61  se table, databa
b250: 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20  se index .** or 
b260: 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20  ephermal table) 
b270: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d  is stored in pX-
b280: 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74  >iTable before t
b290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b2a0: 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74  urns..** The ret
b2b0: 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
b2c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
b2d0: 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
b2e0: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
b2f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
b300: 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65  NDEX_ROWID - The
b310: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
b320: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
b330: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
b340: 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68  INDEX_INDEX - Th
b350: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
b360: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
b370: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  e index..**   IN
b380: 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54  _INDEX_EPH -   T
b390: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
b3a0: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
b3b0: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
b3c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b3d0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
b3e0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
b3f0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
b400: 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20 6f 6e  ng b-tree may on
b410: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ly be used if th
b420: 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
b430: 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72  he simple.** for
b440: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  m:.**.**     SEL
b450: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
b460: 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
b470: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b480: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
b490: 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  , then the b-tre
b4a0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
b4b0: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
b4c0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
b4d0: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
b4e0: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
b4f0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
b500: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
b510: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
b520: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
b530: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
b540: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
b550: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
b560: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
b570: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
b580: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
b590: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f   has a UNIQUE co
b5a0: 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51  nstraint or UNIQ
b5b0: 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  UE index..**.** 
b5c0: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b5d0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
b5e0: 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62  ot 0, then the b
b5f0: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
b600: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
b610: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
b620: 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ests. In this ca
b630: 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  se an epheremal 
b640: 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
b650: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
b660: 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54  olumn> is an INT
b670: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b680: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   or an index can
b690: 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69   .** be found wi
b6a0: 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69  th <column> as i
b6b0: 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ts left-most col
b6c0: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  umn..**.** When 
b6d0: 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
b6e0: 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
b6f0: 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
b700: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
b710: 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  ion.** needs to 
b720: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
b730: 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72  not the structur
b740: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51  e contains an SQ
b750: 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65  L NULL .** value
b760: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72   in order to cor
b770: 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20  rectly evaluate 
b780: 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65  expressions like
b790: 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a   "X IN (Y, Z)"..
b7a0: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
b7b0: 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
b7c0: 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
b7d0: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
b7e0: 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
b7f0: 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
b800: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
b810: 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
b820: 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
b830: 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e  ** to *prNotFoun
b840: 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  d. If there is n
b850: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
b860: 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
b870: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
b880: 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75  , then *prNotFou
b890: 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  nd is left uncha
b8a0: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
b8b0: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
b8c0: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
b8d0: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
b8e0: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74  n *prNotFound, t
b8f0: 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69  hen.** its initi
b900: 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  al value is NULL
b910: 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20  .  If the (...) 
b920: 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20  does not remain 
b930: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
b940: 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20  the duration of 
b950: 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20  the query (i.e. 
b960: 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68 69  the SELECT withi
b970: 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69  n the (...).** i
b980: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
b990: 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
b9a0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
b9b0: 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65  llocated registe
b9c0: 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f  r is.** reset to
b9d0: 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20   NULL each time 
b9e0: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
b9f0: 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f  rerun. This allo
ba00: 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  ws the.** caller
ba10: 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64   to use vdbe cod
ba20: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
ba30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
ba40: 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73  *.**   if( regis
ba50: 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20  ter==NULL ){.** 
ba60: 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c      has_null = <
ba70: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
ba80: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
ba90: 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67  null>.**     reg
baa0: 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d  ister = 1.**   }
bab0: 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  .**.** in order 
bac0: 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67  to avoid running
bad0: 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61   the <test if da
bae0: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
baf0: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74  tains null>.** t
bb00: 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  est more often t
bb10: 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  han is necessary
bb20: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
bb30: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
bb40: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
bb50: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
bb60: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
bb70: 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e  , int *prNotFoun
bb80: 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  d){.  Select *p;
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bbb0: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
bbc0: 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
bbd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
bbe0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc00: 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
bc10: 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
bc20: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
bc30: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
bc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
bc50: 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
bc60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
bc70: 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e  tBeUnique = (prN
bc80: 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f  otFound==0);   /
bc90: 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
bca0: 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
bcb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
bcc0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
bcd0: 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
bce0: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
bcf0: 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
bd00: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
bd10: 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  IN );..  /* Chec
bd20: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
bd30: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
bd40: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
bd50: 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
bd60: 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
bd70: 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
bd80: 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
bd90: 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
bda0: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  meral table..  *
bdb0: 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73  /.  p = (ExprHas
bdc0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
bdd0: 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d  xIsSelect) ? pX-
bde0: 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b  >x.pSelect : 0);
bdf0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
be00: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26  arse->nErr==0) &
be10: 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  & isCandidateFor
be20: 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20  InOpt(p) ){.    
be30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
be40: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
be50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
be60: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
be70: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
be80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
be90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bea0: 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
beb0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
bec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bee0: 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d  xpression <colum
bef0: 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  n> */.    int iC
bf00: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
bf30: 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a  umn <column> */.
bf40: 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
bf70: 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70  tabase idx for p
bf80: 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  Tab */..    asse
bf90: 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20 20  rt( p );        
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
bfc0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
bfd0: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
bfe0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
bff0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
c000: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
c010: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
c020: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
c030: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
c040: 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
c050: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
c060: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
c070: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
c080: 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
c090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c0a0: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
c0b0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
c0c0: 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
c0d0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
c0e0: 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72  .pTab;.    pExpr
c0f0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
c100: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43  0].pExpr;.    iC
c110: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
c120: 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20  umn;.   .    /* 
c130: 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69 66  Code an OP_Verif
c140: 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54  yCookie and OP_T
c150: 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
c160: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
c170: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
c180: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
c190: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c1a0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
c1b0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
c1c0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
c1d0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
c1e0: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
c1f0: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
c200: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  me);..    /* Thi
c210: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
c220: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
c230: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
c240: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
c250: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
c260: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
c270: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
c280: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
c290: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
c2a0: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
c2b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c2c0: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
c2d0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
c2e0: 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20 20 20  int iAddr;..    
c2f0: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
c300: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
c310: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
c320: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
c330: 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
c340: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
c350: 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
c360: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
c370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c380: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
c390: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
c3a0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
c3b0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c3d0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
c3e0: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
c3f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
c400: 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65  ence used by the
c410: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20   comparison. If 
c420: 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20  an index is to. 
c430: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
c440: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
c450: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
c460: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
c470: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
c480: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
c490: 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a  n sequence.  */.
c4a0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
c4b0: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
c4c0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
c4d0: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
c4e0: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
c4f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
c500: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
c510: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
c520: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
c530: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
c540: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
c550: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
c560: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
c570: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
c580: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
c590: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
c5a0: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
c5b0: 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
c5c0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
c5d0: 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20  Affinity(pX);.  
c5e0: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
c5f0: 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f  _ok = (pTab->aCo
c600: 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
c610: 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49  ==aff||aff==SQLI
c620: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20  TE_AFF_NONE);.. 
c630: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
c640: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
c650: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
c660: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
c670: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
c680: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
c690: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
c6a0: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
c6b0: 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  & sqlite3FindCol
c6c0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
c6d0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
c6e0: 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20  ], 0)==pReq.    
c6f0: 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65       && (!mustBe
c700: 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d  Unique || (pIdx-
c710: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
c720: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
c730: 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20  _None)).        
c740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c750: 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20   iAddr;.        
c760: 20 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20    char *pKey;.  
c770: 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 20  .          pKey 
c780: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
c790: 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
c7a0: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
c7b0: 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73         iAddr = s
c7c0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
c7d0: 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 20 20 20  Parse);.  .     
c7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c7f0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
c800: 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
c810: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
c840: 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  y,P4_KEYINFO_HAN
c850: 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20  DOFF);.         
c860: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
c870: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
c880: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
c890: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
c8a0: 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20  _INDEX;..       
c8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c8c0: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
c8d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c8e0: 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70  prNotFound && !p
c8f0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c900: 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  notNull ){.     
c910: 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75         *prNotFou
c920: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
c930: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
c940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c950: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
c960: 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a  , *prNotFound);.
c970: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c980: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c990: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
c9a0: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
c9b0: 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e  * Could not foun
c9c0: 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
c9d0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
c9e0: 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
c9f0: 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
ca00: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
ca10: 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
ca20: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
ca30: 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
ca40: 20 20 20 20 64 6f 75 62 6c 65 20 73 61 76 65 64      double saved
ca50: 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
ca60: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
ca70: 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
ca80: 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
ca90: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
caa0: 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e  EPH;.    if( prN
cab0: 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20  otFound ){.     
cac0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72   *prNotFound = r
cad0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
cae0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
caf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cb00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
cb10: 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  , 0, *prNotFound
cb20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cb30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
cb40: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
cb50: 3e 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20  >(double)1 );.  
cb60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
cb70: 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65  ryLoop = (double
cb80: 29 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  )1;.      if( pX
cb90: 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
cba0: 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 41 6e  <0 && !ExprHasAn
cbb0: 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  yProperty(pX, EP
cbc0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
cbd0: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
cbe0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
cbf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cc00: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
cc10: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
cc20: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
cc30: 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
cc40: 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
cc50: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
cc60: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
cc70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
cc80: 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
cc90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
cca0: 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
ccb0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
ccc0: 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
ccd0: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
cce0: 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
ccf0: 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
cd00: 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
cd10: 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
cd20: 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
cd30: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
cd40: 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
cd50: 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
cd60: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
cd70: 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
cd80: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
cd90: 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
cda0: 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
cdb0: 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
cdc0: 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
cdd0: 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
cde0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
cdf0: 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
ce00: 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
ce10: 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
ce20: 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
ce30: 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
ce40: 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
ce50: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
ce60: 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
ce70: 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
ce80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
ce90: 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
cea0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
ceb0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
cec0: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
ced0: 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
cee0: 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
cef0: 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
cf00: 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
cf10: 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
cf20: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
cf30: 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
cf40: 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
cf50: 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
cf60: 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
cf70: 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
cf80: 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
cf90: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
cfa0: 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
cfb0: 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
cfc0: 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
cfd0: 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
cfe0: 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
cff0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
d000: 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
d010: 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
d020: 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
d030: 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
d040: 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
d050: 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46  ains NULLs..** F
d060: 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20  urthermore, the 
d070: 49 4e 20 69 73 20 69 6e 20 61 20 57 48 45 52 45  IN is in a WHERE
d080: 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74   clause and that
d090: 20 77 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a   we really want.
d0a0: 2a 2a 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76  ** to iterate ov
d0b0: 65 72 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  er the RHS of th
d0c0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e  e IN operator in
d0d0: 20 6f 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c   order to quickl
d0e0: 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20  y locate.** all 
d0f0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48  corresponding LH
d100: 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c  S elements.  All
d110: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
d120: 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  es is initialize
d130: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
d140: 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
d150: 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20  veNull to NULL. 
d160: 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   Calling routine
d170: 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63  s will take.** c
d180: 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
d190: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 76 61  this register va
d1a0: 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20  lue to non-NULL 
d1b0: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
d1c0: 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  LL-free..**.** I
d1d0: 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
d1e0: 73 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  s zero, that mea
d1f0: 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62 71  ns that the subq
d200: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  uery is being us
d210: 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72  ed.** for member
d220: 73 68 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c  ship testing onl
d230: 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  y.  There is no 
d240: 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  need to initiali
d250: 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74  ze any.** regist
d260: 65 72 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ers to indicate 
d270: 74 68 65 20 70 72 65 73 65 6e 73 65 20 6f 72 20  the presense or 
d280: 61 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73  absence of NULLs
d290: 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a   on the RHS..**.
d2a0: 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
d2b0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
d2c0: 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
d2d0: 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
d2e0: 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
d2f0: 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74  .  For IN operat
d300: 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ors or if an err
d310: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72  or occurs, the r
d320: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30  eturn value is 0
d330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
d340: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
d350: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
d360: 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
d370: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d380: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d390: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d3a0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
d3b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
d3c0: 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
d3d0: 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
d3e0: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
d3f0: 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  l,       /* Regi
d400: 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
d410: 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
d420: 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
d430: 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
d440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
d450: 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
d460: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
d470: 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
d480: 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b 20 20  testAddr = -1;  
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
d4b0: 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
d4c0: 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
d4f0: 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
d500: 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62  sulting */.  Vdb
d510: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
d520: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
d530: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
d540: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
d550: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
d560: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ush(pParse);..  
d570: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
d580: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
d590: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
d5a0: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
d5b0: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
d5c0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
d5d0: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
d5e0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
d5f0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
d600: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
d610: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
d620: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
d630: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
d640: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
d650: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
d660: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
d670: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
d680: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
d690: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
d6a0: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
d6b0: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
d6c0: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
d6d0: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
d6e0: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
d6f0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
d700: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
d710: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
d720: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
d730: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
d740: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
d750: 74 29 20 29 7b 0a 20 20 20 20 74 65 73 74 41 64  t) ){.    testAd
d760: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
d770: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
d780: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d790: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
d7a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
d7b0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
d7c0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
d7d0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
d7e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
d7f0: 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
d800: 42 51 55 45 52 59 20 25 64 22 2c 20 74 65 73 74  BQUERY %d", test
d810: 41 64 64 72 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  Addr>=0?"":"CORR
d820: 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
d830: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
d840: 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
d850: 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  R", pParse->iNex
d860: 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b  tSelectId.    );
d870: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d880: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
d890: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
d8a0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
d8b0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
d8c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d8d0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
d8e0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
d8f0: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
d900: 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
d910: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
d920: 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
d930: 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
d940: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
d950: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
d960: 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 74 68  * Keyinfo for th
d970: 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
d980: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
d990: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
d9a0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
d9b0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
d9c0: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
d9d0: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
d9e0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
d9f0: 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
da00: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
da10: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 69  ator */..      i
da20: 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
da30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
da40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
da50: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79  OP_Null, 0, rMay
da60: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
da70: 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69   }..      affini
da80: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
da90: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
daa0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
dab0: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
dac0: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
dad0: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
dae0: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
daf0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
db00: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
db10: 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
db20: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
db30: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
db40: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
db50: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
db60: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
db70: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
db80: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
db90: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
dba0: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
dbb0: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
dbc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
dbd0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
dbe0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
dbf0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
dc00: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
dc10: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
dc20: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
dc30: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
dc40: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
dc50: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
dc60: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
dc70: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
dc80: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
dc90: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
dca0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
dcb0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
dcc0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
dcd0: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
dce0: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
dcf0: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
dd00: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
dd10: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
dd20: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
dd30: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
dd40: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
dd50: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
dd60: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
dd70: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
dd80: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
dd90: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
dda0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ddb0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
ddc0: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
ddd0: 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
dde0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ;.      if( rMay
ddf0: 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20 73 71  HaveNull==0 ) sq
de00: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
de10: 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
de20: 45 52 45 44 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ERED);.      mem
de30: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
de40: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
de50: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
de60: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20  .nField = 1;..  
de70: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
de80: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
de90: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
dea0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
deb0: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
dec0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
ded0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
dee0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
def0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
df00: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
df10: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
df20: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
df30: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
df40: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
df50: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
df60: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
df70: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
df80: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
df90: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
dfa0: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
dfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
dfc0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
dfd0: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
dfe0: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
dff0: 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74      dest.affinit
e000: 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79  y = (u8)affinity
e010: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e020: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
e030: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
e040: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
e050: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
e060: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
e070: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
e080: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e090: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e  Parse, pExpr->x.
e0a0: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
e0b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
e0c0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
e0d0: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
e0e0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
e0f0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
e100: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
e110: 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 4c 69  EList!=0 && pELi
e120: 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b 20  st->nExpr>0) ){ 
e130: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e  .          keyIn
e140: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  fo.aColl[0] = sq
e150: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
e160: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
e170: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a  , pExpr->pLeft,.
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
e190: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
e1a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e1b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
e1c0: 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
e1d0: 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
e1e0: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
e1f0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
e200: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
e210: 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
e220: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
e230: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
e240: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
e250: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
e260: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
e270: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
e280: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
e290: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
e2a0: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
e2b0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
e2c0: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
e2d0: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
e2e0: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
e2f0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
e300: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
e310: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
e320: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e330: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
e340: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
e350: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
e360: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
e370: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e380: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Item;.        in
e390: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20  t r1, r2, r3;.. 
e3a0: 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
e3b0: 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
e3c0: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
e3d0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
e3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e3f0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
e400: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
e410: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
e420: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20  xpr->pLeft);..  
e430: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
e440: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
e450: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
e460: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
e470: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
e480: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
e490: 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
e4a0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
e4b0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
e4c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e4d0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
e4e0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f   r2);.        fo
e4f0: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
e500: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
e510: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
e520: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
e530: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
e540: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
e550: 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e      int iValToIn
e560: 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  s;..          /*
e570: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e580: 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
e590: 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
e5a0: 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
e5b0: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
e5c0: 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
e5d0: 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
e5e0: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
e5f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
e600: 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
e610: 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
e620: 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
e630: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
e640: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
e650: 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
e660: 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
e670: 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
e680: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
e690: 65 73 74 41 64 64 72 3e 3d 30 20 26 26 20 21 73  estAddr>=0 && !s
e6a0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
e6b0: 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
e6c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e6d0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
e6e0: 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20  (v, testAddr);. 
e6f0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41             testA
e700: 64 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ddr = -1;.      
e710: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
e720: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
e730: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
e740: 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
e750: 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
e760: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
e770: 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
e780: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
e790: 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
e7a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
e7b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e7c0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
e7d0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
e7e0: 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
e7f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e800: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
e810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
e820: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
e830: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
e840: 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
e850: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
e860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e870: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
e880: 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e8b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e8c0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
e8d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e8e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
e8f0: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
e900: 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20  able, r2, r3);. 
e910: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
e920: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e940: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
e950: 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
e960: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
e970: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e980: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
e990: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
e9a0: 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20  e, r3, 1);.     
e9b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e9c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e9d0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
e9e0: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a  r->iTable, r2);.
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
ea00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ea10: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
ea20: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ea30: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
ea40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
ea50: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
ea60: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
ea70: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 52  }.      if( !isR
ea80: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
ea90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
eaa0: 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
eab0: 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50  id *)&keyInfo, P
eac0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
ead0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
eae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
eaf0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
eb00: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
eb10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
eb20: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
eb30: 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c  has to be a scal
eb40: 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65  ar SELECT.  Gene
eb50: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
eb60: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
eb70: 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65  lue of this sele
eb80: 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63  ct in a memory c
eb90: 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ell and record t
eba0: 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  he number.      
ebb0: 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** of the memory
ebc0: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
ebd0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  .  If this is an
ebe0: 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20   EXISTS, write. 
ebf0: 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67       ** an integ
ec00: 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
ec10: 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20  ) or 1 (exists) 
ec20: 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65  into a memory ce
ec30: 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ll.      ** and 
ec40: 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f  record that memo
ec50: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
ec60: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
ec70: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
eca0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
ecb0: 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  encode */.      
ecc0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
ecf0: 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74  deal with SELECt
ed00: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
ed10: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ed20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
ed30: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ed40: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ed50: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
ed60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ed70: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
ed80: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
ed90: 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20  SELECT );..     
eda0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
edb0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
edc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
edd0: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
ede0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
edf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
ee00: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
ee10: 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
ee20: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
ee30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
ee40: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
ee50: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
ee60: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
ee70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ee80: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ee90: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
eea0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
eeb0: 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
eec0: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
eed0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eee0: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
eef0: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
ef00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ef10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
ef20: 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50  eger, 0, dest.iP
ef30: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
ef40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
ef50: 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
ef60: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
ef70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
ef80: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
ef90: 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
efa0: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
efb0: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
efc0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
efd0: 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20  TEGER, 0, 0,.   
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
f000: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
f010: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  [1]);.      pSel
f020: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
f030: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
f040: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
f050: 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  el, &dest) ){.  
f060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
f070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52        }.      rR
f080: 65 67 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  eg = dest.iParm;
f090: 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72  .      ExprSetIr
f0a0: 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
f0b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f0c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
f0d0: 74 65 73 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20  testAddr>=0 ){. 
f0e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
f0f0: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
f100: 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dr);.  }.  sqlit
f110: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
f120: 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65  Parse, 1);..  re
f130: 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
f140: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
f150: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
f160: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f170: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
f180: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f190: 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
f1a0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
f1b0: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
f1c0: 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
f1d0: 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
f1e0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
f1f0: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
f200: 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
f210: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
f220: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
f230: 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
f240: 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
f250: 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
f260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f270: 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
f280: 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
f290: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
f2a0: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
f2b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f2c0: 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
f2d0: 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
f2e0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
f2f0: 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
f300: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
f310: 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
f320: 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
f330: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
f340: 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
f350: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
f360: 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70  s code will jump
f370: 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
f380: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
f390: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
f3a0: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
f3b0: 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
f3c0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
f3d0: 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
f3e0: 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
f3f0: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
f400: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
f410: 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
f420: 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
f430: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
f440: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
f450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f460: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f470: 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
f480: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
f490: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
f4a0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
f4b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
f4c0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
f4d0: 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
f4e0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
f4f0: 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
f500: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
f510: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
f520: 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
f530: 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
f540: 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
f550: 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
f560: 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
f570: 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
f580: 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
f590: 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
f5a0: 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
f5b0: 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
f5c0: 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
f5d0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e   */.  char affin
f5e0: 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  ity;        /* C
f5f0: 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
f600: 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69  ty to use */.  i
f610: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
f620: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
f630: 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
f640: 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
f650: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
f660: 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
f670: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
f680: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
f690: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
f6a0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  ruction */..  /*
f6b0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   Compute the RHS
f6c0: 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73  .   After this s
f6d0: 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77  tep, the table w
f6e0: 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  ith cursor.  ** 
f6f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69  pExpr->iTable wi
f700: 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ll contains the 
f710: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
f720: 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   up the RHS..  *
f730: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
f740: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
f750: 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
f760: 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
f770: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
f780: 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
f790: 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
f7a0: 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
f7b0: 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
f7c0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
f7d0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52  arse, pExpr, &rR
f7e0: 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f  hsHasNull);..  /
f7f0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
f800: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
f810: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
f820: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
f830: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78  s.  ** of the ex
f840: 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
f850: 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
f860: 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
f870: 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50  table for.  ** P
f880: 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
f890: 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e  rd..  */.  affin
f8a0: 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
f8b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
f8c0: 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
f8d0: 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
f8e0: 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
f8f0: 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73  (...)"..  */.  s
f900: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
f910: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72  ush(pParse);.  r
f920: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
f930: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f940: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f950: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
f960: 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f  pLeft, r1);..  /
f970: 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  * If the LHS is 
f980: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
f990: 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72 20  esult is either 
f9a0: 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65  false or NULL de
f9b0: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20  pending.  ** on 
f9c0: 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20  whether the RHS 
f9d0: 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c  is empty or not,
f9e0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
f9f0: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
fa00: 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
fa10: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72  e ){.    /* Shor
fa20: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d  tcut for the com
fa30: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
fa40: 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c  he false and NUL
fa50: 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20  L outcomes are. 
fa60: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
fa70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
fa80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fa90: 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49  sNull, r1, destI
faa0: 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
fab0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d  .    int addr1 =
fac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fad0: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
fae0: 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
faf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fb00: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
fb10: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
fb20: 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  False);.    sqli
fb30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fb40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
fb50: 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  tIfNull);.    sq
fb60: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fb70: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d  e(v, addr1);.  }
fb80: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  ..  if( eType==I
fb90: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
fba0: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
fbb0: 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
fbc0: 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
fbd0: 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a  ble b-tree.    *
fbe0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
fbf0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
fc00: 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73  stBeInt, r1, des
fc10: 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
fc20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fc30: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
fc40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fc50: 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
fc60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fc70: 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
fc80: 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69   the RHS is an i
fc90: 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20  ndex b-tree..   
fca0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
fcb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
fcc0: 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
fcd0: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
fce0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
fcf0: 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  e set membership
fd00: 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
fd10: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
fd20: 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  the .    ** "x I
fd30: 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  N (...)" express
fd40: 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68  ion must be eith
fd50: 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66  er 0 or NULL. If
fd60: 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20   the set.    ** 
fd70: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
fd80: 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
fd90: 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
fda0: 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a  f the set .    *
fdb0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
fdc0: 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
fdd0: 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
fde0: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
fdf0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
fe00: 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  also NULL..    *
fe10: 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73 48 61  /.    if( rRhsHa
fe20: 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74  sNull==0 || dest
fe30: 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
fe40: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
fe50: 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
fe60: 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
fe70: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
fe80: 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20  that the RHS.   
fe90: 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e     ** cannot con
fea0: 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73  tain NULL values
feb0: 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61  . This happens a
fec0: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  s the result.   
fed0: 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20     ** of a "NOT 
fee0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
fef0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
ff00: 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a   schema..      *
ff10: 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20  *.      ** Also 
ff20: 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20  run this branch 
ff30: 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76  if NULL is equiv
ff40: 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20  alent to FALSE. 
ff50: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
ff60: 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
ff70: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a  perator..      *
ff80: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
ff90: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
ffa0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
ffb0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
ffc0: 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
ffd0: 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ..    }else{.   
ffe0: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
fff0: 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
10000 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
10010 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
10020 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
10030 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c  esence of a NULL
10040 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65   on the RHS make
10050 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69  s a difference i
10060 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f  n the.      ** o
10070 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f  utcome..      */
10080 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  .      int j1, j
10090 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a  2, j3;..      /*
100a0 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
100b0 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
100c0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
100d0 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
100e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
100f0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
10100 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
10110 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20  oes not matter, 
10120 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a  so jump.      **
10130 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
10140 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
10150 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ws..      */.   
10160 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
10170 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10180 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
10190 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
101a0 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65  1);..      /* He
101b0 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65  re we begin gene
101c0 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74  rating code that
101d0 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53   runs if the LHS
101e0 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
101f0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10200 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65  n the RHS.  Gene
10210 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  rate additional 
10220 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20 20  code that.      
10230 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48 53  ** tests the RHS
10240 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20   for NULLs.  If 
10250 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
10260 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20   a NULL then.   
10270 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
10280 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
10290 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73  ere are no NULLs
102a0 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
102b0 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
102c0 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20  o destIfFalse.. 
102d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32       */.      j2
102e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
102f0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
10300 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29  ll, rRhsHasNull)
10310 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c  ;.      j3 = sql
10320 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10330 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
10340 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
10350 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
10360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10370 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10380 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68  Integer, -1, rRh
10390 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
103a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
103b0 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20  Here(v, j3);.   
103c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
103d0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
103e0 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  m, rRhsHasNull, 
103f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10400 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10410 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   j2);..      /* 
10420 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72  Jump to the appr
10430 6f 70 72 69 61 74 65 20 74 61 72 67 65 74 20 64  opriate target d
10440 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
10450 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20  her or not.     
10460 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74   ** the RHS cont
10470 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20  ains a NULL.    
10480 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10490 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
104a0 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75  OP_If, rRhsHasNu
104b0 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
104c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
104d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
104e0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
104f0 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  lse);..      /* 
10500 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20  The OP_Found at 
10510 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
10520 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72  branch jumps her
10530 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20  e when true, .  
10540 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74      ** causing t
10550 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78  he overall IN ex
10560 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
10570 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f  ion to fall thro
10580 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
10590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
105a0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
105b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
105c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
105d0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
105e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
105f0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
10600 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
10610 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
10620 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
10630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10640 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
10650 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
10660 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
10670 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
10680 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
10690 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
106a0 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
106b0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
106c0 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
106d0 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
106e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
106f0 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
10700 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69  eturn out;.}..#i
10710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10720 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
10730 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10740 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
10750 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
10760 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
10770 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
10780 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
10790 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
107a0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
107b0 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
107c0 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
107d0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
107e0 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
107f0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
10800 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
10810 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
10820 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
10830 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
10840 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
10850 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
10860 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
10870 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
10880 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
10890 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
108a0 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
108b0 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
108c0 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20  value;.    char 
108d0 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *zV;.    sqlite3
108e0 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
108f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10900 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
10910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
10920 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
10930 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
10940 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
10950 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
10960 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
10970 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
10980 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
10990 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
109a0 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lue);.    sqlite
109b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
109c0 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
109d0 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
109e0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
109f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10a00 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
10a10 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
10a20 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
10a30 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
10a40 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
10a50 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
10a60 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
10a70 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
10a80 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
10a90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
10aa0 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
10ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
10ac0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
10ad0 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
10ae0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
10af0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
10b00 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
10b10 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
10b20 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
10b30 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
10b40 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
10b50 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
10b60 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
10b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10b90 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
10ba0 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
10bb0 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
10bc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
10bd0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
10be0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
10bf0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
10c00 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
10c10 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
10c20 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
10c30 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69 66  TE_UTF8);.    if
10c40 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
10c50 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
10c60 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
10c70 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
10c80 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
10c90 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
10ca0 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
10cb0 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
10cc0 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
10cd0 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
10ce0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10cf0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
10d00 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
10d10 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
10d20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
10d30 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
10d40 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
10d50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10d60 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
10d70 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
10d80 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
10d90 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
10da0 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
10db0 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23  egFlag, iMem);.#
10dc0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
10dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
10de0 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
10df0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
10e00 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
10e10 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
10e20 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
10e30 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
10e40 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
10e50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
10e60 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
10e70 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
10e80 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
10e90 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
10ea0 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
10eb0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
10ec0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
10ed0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
10ee0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
10ef0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
10f00 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
10f10 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
10f20 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
10f30 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
10f40 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
10f50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
10f60 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
10f70 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10f80 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
10f90 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
10fa0 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
10fb0 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
10fc0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
10fd0 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  he *p;..  assert
10fe0 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20  ( iReg>0 );  /* 
10ff0 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  Register numbers
11000 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
11010 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
11020 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
11030 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
11040 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
11050 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
11060 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
11070 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
11080 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
11090 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
110a0 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
110b0 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
110c0 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
110d0 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
110e0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
110f0 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
11100 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
11110 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
11120 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
11130 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6c 75  gs & SQLITE_Colu
11140 6d 6e 43 61 63 68 65 20 29 20 72 65 74 75 72 6e  mnCache ) return
11150 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
11160 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
11170 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
11180 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
11190 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
111a0 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
111b0 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
111c0 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
111d0 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
111e0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
111f0 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
11200 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
11210 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
11220 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
11230 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
11240 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
11250 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
11260 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
11270 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67   assert( p->iReg
11280 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65  ==0 || p->iTable
11290 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
112a0 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
112b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
112c0 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ind an empty slo
112d0 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  t and replace it
112e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
112f0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
11300 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
11310 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
11320 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
11330 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Reg==0 ){.      
11340 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
11350 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
11360 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  .      p->iTable
11370 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70   = iTab;.      p
11380 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
11390 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
113a0 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
113b0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
113c0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
113d0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
113e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
113f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11400 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74  Replace the last
11410 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a   recently used *
11420 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37  /.  minLru = 0x7
11430 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72  fffffff;.  idxLr
11440 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  u = -1;.  for(i=
11450 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11460 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11470 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11480 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
11490 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
114a0 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20  .      idxLru = 
114b0 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  i;.      minLru 
114c0 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a  = p->lru;.    }.
114d0 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53    }.  if( ALWAYS
114e0 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20  (idxLru>=0) ){. 
114f0 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
11500 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75  aColCache[idxLru
11510 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  ];.    p->iLevel
11520 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
11530 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69  eLevel;.    p->i
11540 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
11550 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
11560 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67  Col;.    p->iReg
11570 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e   = iReg;.    p->
11580 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
11590 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
115a0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
115b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d     return;.  }.}
115c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
115d0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20   that registers 
115e0 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52  between iReg..iR
115f0 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65  eg+nReg-1 are be
11600 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
11610 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61  .** Purge the ra
11620 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
11630 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
11640 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20   cache..*/.void 
11650 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11660 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  Remove(Parse *pP
11670 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
11680 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
11690 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20   i;.  int iLast 
116a0 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20  = iReg + nReg - 
116b0 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  1;.  struct yCol
116c0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
116d0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
116e0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
116f0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11700 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
11710 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
11720 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26     if( r>=iReg &
11730 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  & r<=iLast ){.  
11740 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
11750 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
11760 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
11770 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
11780 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  /*.** Remember t
11790 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
117a0 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e  n cache context.
117b0 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65    Any new entrie
117c0 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64  s added.** added
117d0 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   to the column c
117e0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
117f0 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64  call are removed
11800 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72   when the.** cor
11810 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f  responding pop o
11820 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
11830 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
11840 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
11850 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43  e){.  pParse->iC
11860 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a  acheLevel++;.}..
11870 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f  /*.** Remove fro
11880 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
11890 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  he any entries t
118a0 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73  hat were added s
118b0 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20  ince the.** the 
118c0 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68 20  previous N Push 
118d0 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20  operations.  In 
118e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73  other words, res
118f0 74 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a 2a  tore the cache.*
11900 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69  * to the state i
11910 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68 65  t was in N Pushe
11920 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s ago..*/.void s
11930 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
11940 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
11950 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  , int N){.  int 
11960 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
11970 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65  Cache *p;.  asse
11980 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73  rt( N>0 );.  ass
11990 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
119a0 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20  cheLevel>=N );. 
119b0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
119c0 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72  evel -= N;.  for
119d0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
119e0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
119f0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
11a00 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
11a10 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d  f( p->iReg && p-
11a20 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
11a30 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20  iCacheLevel ){. 
11a40 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
11a50 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
11a60 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
11a70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11a80 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
11a90 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
11aa0 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
11ab0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
11ac0 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
11ad0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
11ae0 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
11af0 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
11b00 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
11b10 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
11b20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
11b30 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
11b40 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
11b50 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
11b60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11b70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
11b80 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
11b90 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
11ba0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
11bb0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
11bc0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
11bd0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11be0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11bf0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11c00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
11c10 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
11c20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
11c30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11c40 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
11c50 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
11c60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
11c70 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
11c80 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  of a table..*/.v
11c90 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11ca0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
11cb0 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ble(.  Vdbe *v, 
11cc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
11cd0 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
11ce0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  ction */.  Table
11cf0 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *pTab,    /* Th
11d00 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
11d10 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a  ng the value */.
11d20 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
11d30 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
11d40 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a  for this table *
11d50 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
11d60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
11d70 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
11d80 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
11d90 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
11da0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 64 20  tract the valud 
11db0 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
11dc0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  er */.){.  if( i
11dd0 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
11de0 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
11df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11e00 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
11e10 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
11e20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11e30 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
11e40 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
11e50 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
11e60 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
11e70 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
11e80 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72  iTabCur, iCol, r
11e90 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
11ea0 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
11eb0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
11ec0 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
11ed0 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
11ee0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
11ef0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
11f00 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
11f10 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
11f20 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
11f30 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
11f40 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
11f50 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 41  n a register.  A
11f60 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d  n effort.** is m
11f70 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ade to store the
11f80 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
11f90 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c 20   register iReg, 
11fa0 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e  but this is.** n
11fb0 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20  ot guaranteed.  
11fc0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
11fd0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
11fe0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
11ff0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
12000 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
12010 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
12020 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
12030 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
12040 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
12050 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
12060 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
12070 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
12080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
12090 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
120a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
120b0 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
120c0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
120d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
120e0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
120f0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
12100 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
12110 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
12120 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
12130 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
12140 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
12150 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
12160 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
12170 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
12180 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
12190 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
121a0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
121b0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
121c0 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
121d0 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
121e0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b   OP_Column */.){
121f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
12200 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
12210 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
12220 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
12230 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12240 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12250 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12260 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12270 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
12280 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
12290 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
122a0 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
122b0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
122c0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
122d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
122e0 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
122f0 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
12300 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
12310 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
12320 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
12330 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
12340 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
12350 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
12360 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
12370 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
12380 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
12390 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
123a0 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65  (v, p5);.  }else
123b0 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  {   .    sqlite3
123c0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
123d0 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
123e0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
123f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
12400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
12410 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
12420 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
12430 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
12440 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
12450 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
12460 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
12470 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
12480 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12490 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
124a0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
124b0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
124c0 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20  ( p->iReg ){.   
124d0 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
124e0 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
124f0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
12500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12510 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
12520 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66  fact that an aff
12530 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
12540 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f   occurred on iCo
12550 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  unt.** registers
12560 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69   starting with i
12570 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Start..*/.void s
12580 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
12590 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61  ffinityChange(Pa
125a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
125b0 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f   iStart, int iCo
125c0 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  unt){.  sqlite3E
125d0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
125e0 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69  Parse, iStart, i
125f0 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Count);.}../*.**
12600 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12610 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66  o move content f
12620 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
12630 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
12640 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
12650 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b  o..iTo+nReg-1. K
12660 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  eep the column c
12670 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ache up-to-date.
12680 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12690 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
126a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
126b0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
126c0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
126d0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
126e0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69 66 28  lCache *p;.  if(
126f0 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54   NEVER(iFrom==iT
12700 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  o) ) return;.  s
12710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12720 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
12730 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
12740 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f  iTo, nReg);.  fo
12750 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12760 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12770 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12780 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
12790 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b  int x = p->iReg;
127a0 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f  .    if( x>=iFro
127b0 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65  m && x<iFrom+nRe
127c0 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52  g ){.      p->iR
127d0 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b  eg += iTo-iFrom;
127e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
127f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12800 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e  e to copy conten
12810 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
12820 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
12830 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
12840 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
12850 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12860 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61  3ExprCodeCopy(Pa
12870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12880 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
12890 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
128a0 74 20 69 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  t i;.  if( NEVER
128b0 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72  (iFrom==iTo) ) r
128c0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
128d0 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a  ; i<nReg; i++){.
128e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
128f0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
12900 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 46  dbe, OP_Copy, iF
12910 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a 20  rom+i, iTo+i);. 
12920 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
12930 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
12940 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
12950 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
12960 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
12970 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
12980 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
12990 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
129a0 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
129b0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
129c0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
129d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
129e0 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  e is used within
129f0 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
12a00 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20  stcase() macros 
12a10 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  only.** and does
12a20 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61   not appear in a
12a30 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a   normal build..*
12a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
12a50 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
12a60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12a70 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
12a80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
12a90 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
12aa0 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
12ab0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
12ac0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
12ad0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
12ae0 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
12af0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
12b00 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69  r>=iFrom && r<=i
12b10 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  To ) return 1;  
12b20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
12b30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
12b40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12b50 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45  _DEBUG || SQLITE
12b60 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a  _COVERAGE_TEST *
12b70 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
12b80 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
12b90 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
12ba0 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
12bb0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
12bc0 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
12bd0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
12be0 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
12bf0 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
12c00 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
12c10 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
12c20 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
12c30 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
12c40 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
12c50 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
12c60 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
12c70 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
12c80 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
12c90 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
12ca0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
12cb0 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
12cc0 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
12cd0 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
12ce0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
12cf0 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
12d00 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
12d10 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
12d20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
12d30 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
12d40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
12d50 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
12d60 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
12d70 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
12d80 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
12d90 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
12da0 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
12db0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
12dc0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
12dd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
12de0 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
12df0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
12e00 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
12e10 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
12e20 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
12e30 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
12e40 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
12e50 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
12e60 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
12e70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
12e80 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
12e90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
12ea0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
12eb0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
12ec0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
12ed0 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72  nt r1, r2, r3, r
12ee0 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  4;       /* Vari
12ef0 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
12f00 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bers */.  sqlite
12f10 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12f20 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
12f30 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12f40 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  /..  assert( tar
12f50 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
12f60 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
12f70 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
12f80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
12f90 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12fa0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
12fb0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
12fc0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
12fd0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
12fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
12ff0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
13000 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
13010 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
13020 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
13030 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
13040 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
13050 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
13060 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
13070 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
13080 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
13090 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
130a0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
130b0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
130c0 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
130d0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >0 );.        in
130e0 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d  Reg = pCol->iMem
130f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13100 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13110 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
13120 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
13130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13140 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
13150 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
13160 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13180 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
13190 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
131a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
131b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
131c0 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
131d0 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
131e0 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
131f0 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
13200 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
13210 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
13220 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
13230 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
13240 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
13250 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
13260 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
13270 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13280 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
13290 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
132a0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
132b0 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
132c0 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Base;.      }els
132d0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
132e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
132f0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
13300 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
13310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
13340 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
13350 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
13380 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >op2);.      }. 
13390 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
133a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
133b0 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
133c0 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
133d0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  e, pExpr, 0, tar
133e0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
133f0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
13400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13410 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
13420 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
13430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13440 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13450 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
13460 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
13470 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
13480 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
13490 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
134a0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
134b0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
134c0 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
134d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
134e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
134f0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
13500 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13510 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
13520 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c  8, 0, target, 0,
13530 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13540 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
13550 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13560 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
13570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13580 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
13590 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
135a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
135b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
135c0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
135d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
135e0 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
135f0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
13600 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
13610 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
13620 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13630 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13640 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13660 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
13670 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
13680 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
13690 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
136a0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
136b0 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
136c0 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
136d0 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
136e0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
136f0 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
13700 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
13710 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
13720 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
13730 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
13740 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
13750 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13760 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13770 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
13780 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
13790 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
137a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
137b0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
137c0 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
137d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
137e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
137f0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
13800 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13810 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13820 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
13830 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
13840 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
13850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13860 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
13870 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
13880 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
13890 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
138a0 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
138b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
138c0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
138d0 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20  n[0]=='?' .     
138e0 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d          || strcm
138f0 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
13900 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  n, pParse->azVar
13910 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
13920 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  1])==0 );.      
13930 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13940 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61  ngeP4(v, -1, pPa
13950 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
13960 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34  ->iColumn-1], P4
13970 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
13980 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13990 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
139a0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
139b0 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
139c0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
139d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
139e0 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
139f0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
13a00 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
13a10 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
13a20 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
13a30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13a40 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13a50 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
13a60 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
13a70 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
13a80 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
13a90 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
13aa0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
13ab0 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f      int aff, to_
13ac0 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  op;.      inReg 
13ad0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13ae0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
13af0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
13b00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  rget);.      ass
13b10 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13b20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13b30 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13b40 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
13b50 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
13b60 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
13b70 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66       to_op = aff
13b80 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   - SQLITE_AFF_TE
13b90 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a  XT + OP_ToText;.
13ba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
13bb0 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20  _op==OP_ToText  
13bc0 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
13bd0 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a  _AFF_TEXT    );.
13be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
13bf0 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20  _op==OP_ToBlob  
13c00 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
13c10 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a  _AFF_NONE    );.
13c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
13c30 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
13c40 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45  c || aff!=SQLITE
13c50 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
13c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
13c70 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20  _op==OP_ToInt   
13c80 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
13c90 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
13ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
13cb0 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20  _op==OP_ToReal  
13cc0 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
13cd0 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a  _AFF_REAL    );.
13ce0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13cf0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
13d00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13d10 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
13d20 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65  Blob );.      te
13d30 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
13d40 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20  P_ToNumeric );. 
13d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
13d60 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29  o_op==OP_ToInt )
13d70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13d80 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
13d90 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  al );.      if( 
13da0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b  inReg!=target ){
13db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13dc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13dd0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
13de0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
13df0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
13e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13e20 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29  v, to_op, inReg)
13e30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13e40 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
13e50 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
13e60 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
13e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
13e80 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
13e90 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
13ea0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
13eb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
13ec0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
13ed0 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
13ee0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
13ef0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
13f00 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
13f10 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
13f20 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
13f30 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
13f40 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
13f50 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
13f60 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
13f70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13f80 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
13f90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13fa0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
13fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13fc0 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
13fd0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
13fe0 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
13ff0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14000 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
14010 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14020 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
14030 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
14040 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14050 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
14060 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14070 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
14080 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14090 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
140a0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
140b0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
140c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
140d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
140e0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
140f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14100 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14110 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14120 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
14130 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14140 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
14150 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
14160 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
14170 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
14180 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
14190 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
141a0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
141b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
141c0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
141d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
141e0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
141f0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
14200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14210 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
14220 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14230 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
14240 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
14250 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
14260 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14270 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
14280 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
14290 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
142a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
142b0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
142c0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
142d0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
142e0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
142f0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
14300 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14310 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
14320 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
14330 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
14340 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
14350 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  P2 | SQLITE_NULL
14360 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
14370 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14380 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14390 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
143a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
143b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
143c0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
143d0 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
143e0 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
143f0 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
14400 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
14410 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
14420 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
14430 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
14440 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
14450 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
14460 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
14470 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
14480 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
14490 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
144a0 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
144b0 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
144c0 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
144d0 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
144e0 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
144f0 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
14500 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
14510 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
14520 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
14530 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
14540 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14550 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
14560 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
14570 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
14580 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
14590 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
145a0 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
145b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
145c0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
145d0 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
145e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
145f0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
14600 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
14610 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
14620 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
14630 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14640 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
14650 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14660 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
14670 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
14680 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
14690 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
146a0 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
146b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
146c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
146d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
146e0 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
146f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
14700 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
14710 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
14720 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  H );.      testc
14730 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
14740 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
14750 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
14760 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
14770 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
14780 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
14790 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
147a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
147b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
147c0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
147d0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
147e0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
147f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
14800 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
14810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14820 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
14830 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14840 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14850 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14860 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14870 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
14880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14890 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
148a0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
148b0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
148c0 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
148d0 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
148e0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
148f0 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
14900 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
14910 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
14920 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66   1, target);.#if
14930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14940 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
14950 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14960 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
14970 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
14980 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
14990 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
149a0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
149b0 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
149c0 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
149d0 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
149e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
149f0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46  se{.        regF
14a00 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69  ree1 = r1 = sqli
14a10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14a20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
14a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14a40 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14a50 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  0, r1);.        
14a60 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
14a70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14a80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14a90 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
14aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ab0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
14ac0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
14ad0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
14ae0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
14af0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
14b00 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
14b10 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
14b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14b30 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
14b40 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
14b50 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14b60 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
14b70 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
14b80 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
14b90 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
14ba0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
14bb0 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
14bc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
14bd0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
14be0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14bf0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14c00 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14c10 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
14c20 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14c30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
14c40 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
14c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c60 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
14c70 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
14c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14c90 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
14ca0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
14cb0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
14cc0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
14cd0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
14ce0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
14cf0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
14d00 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
14d10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14d20 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
14d30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14d40 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
14d50 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14d60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14d70 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
14d80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
14d90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14da0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14db0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
14dc0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
14dd0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
14de0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
14df0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14e00 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
14e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14e20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14e30 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
14e40 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
14e50 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14e60 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
14e70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14e80 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
14e90 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
14ea0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
14eb0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
14ec0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
14ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
14ee0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
14ef0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14f00 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
14f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14f20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
14f30 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
14f40 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
14f50 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
14f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14f70 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
14f80 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
14f90 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
14fa0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
14fb0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14fc0 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
14fd0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
14fe0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
14ff0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
15000 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
15010 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
15020 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
15030 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
15040 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
15050 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
15060 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
15070 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
15080 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
15090 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
150a0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
150b0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
150c0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
150d0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
150e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
150f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15100 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
15110 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
15120 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  /.      int cons
15130 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
15140 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
15150 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
15160 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
15170 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15190 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
151a0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
151b0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
151c0 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
151d0 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
151e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
151f0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
15200 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
15210 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
15220 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
15230 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
15240 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
15250 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
15260 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15270 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29  =TK_CONST_FUNC )
15280 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15290 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ( op==TK_FUNCTIO
152a0 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
152b0 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
152c0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
152d0 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
152e0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
152f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15300 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
15310 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
15320 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
15330 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
15340 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
15350 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
15360 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15370 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
15380 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
15390 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
153a0 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33     nId = sqlite3
153b0 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20  Strlen30(zId);. 
153c0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
153d0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
153e0 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46  db, zId, nId, nF
153f0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
15400 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
15410 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15420 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15430 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
15440 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e  tion: %.*s()", n
15450 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
15460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15470 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
15480 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
15490 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
154a0 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
154b0 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
154c0 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
154d0 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
154e0 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
154f0 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20  evalation of.   
15500 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
15510 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
15520 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
15530 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15540 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73   if( pDef->flags
15550 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
15560 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20  OALESCE ){.     
15570 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73     int endCoales
15580 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
15590 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
155a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
155b0 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20  arg>=2 );.      
155c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
155d0 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
155e0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
155f0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  get);.        fo
15600 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=1; i<nFarg; 
15610 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15630 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
15640 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c   target, endCoal
15650 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  esce);.         
15660 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15670 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
15680 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
15690 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
156a0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
156b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
156c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
156d0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
156e0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
156f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15700 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
15710 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
15720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
15730 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15740 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
15750 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
15760 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  reak;.      }...
15770 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
15780 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  ){.        r1 = 
15790 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
157a0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
157b0 67 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  g);..        /* 
157c0 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  For length() and
157d0 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69   typeof() functi
157e0 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ons with a colum
157f0 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20  n argument,.    
15800 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50      ** set the P
15810 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  5 parameter to t
15820 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
15830 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45  ode to OPFLAG_LE
15840 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20  NGTHARG.        
15850 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50  ** or OPFLAG_TYP
15860 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76  EOFARG respectiv
15870 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e  ely, to avoid un
15880 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20  necessary data. 
15890 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e         ** loadin
158a0 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
158b0 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
158c0 3e 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  >flags & (SQLITE
158d0 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c  _FUNC_LENGTH|SQL
158e0 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
158f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
15900 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 20 20 20    u8 op;.       
15910 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
15920 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
15930 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
15940 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
15950 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
15960 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
15970 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
15980 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   if( op==TK_COLU
15990 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 47 47  MN || op==TK_AGG
159a0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
159b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
159c0 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
159d0 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  H==OPFLAG_LENGTH
159e0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
159f0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
15a00 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f  E_FUNC_TYPEOF==O
15a10 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
15a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
15a30 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66  estcase( pDef->f
15a40 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 46 55 4e  lags==SQLITE_FUN
15a50 43 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 20 20  C_LENGTH );.    
15a60 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
15a70 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
15a80 20 70 44 65 66 2d 3e 66 6c 61 67 73 3b 0a 20 20   pDef->flags;.  
15a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15aa0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c    }..        sql
15ab0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
15ac0 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  h(pParse);     /
15ad0 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
15ae0 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20  d34be */.       
15af0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15b00 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
15b10 20 70 46 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a   pFarg, r1, 1);.
15b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15b30 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
15b40 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63  se, 1);   /* Tic
15b50 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
15b60 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
15b70 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
15b80 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
15b90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15ba0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
15bb0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
15bc0 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
15bd0 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
15be0 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
15bf0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
15c00 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
15c10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
15c20 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
15c30 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
15c40 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
15c50 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
15c60 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
15c70 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
15c80 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
15c90 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
15ca0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
15cb0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
15cc0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
15cd0 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
15ce0 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
15cf0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
15d00 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
15d10 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
15d20 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
15d30 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
15d40 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
15d50 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
15d60 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
15d70 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
15d80 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
15d90 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
15da0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
15db0 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
15dc0 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
15dd0 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
15de0 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
15df0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
15e00 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
15e10 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
15e20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
15e30 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
15e40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
15e50 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
15e60 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
15e70 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
15e80 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
15e90 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
15ea0 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
15eb0 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
15ec0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
15ed0 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
15ee0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
15ef0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
15f00 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
15f10 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
15f20 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
15f30 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
15f40 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69  ndif.      for(i
15f50 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
15f60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
15f70 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
15f80 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
15f90 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
15fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
15fb0 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29  stMask |= (1<<i)
15fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15fd0 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
15fe0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
15ff0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
16000 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
16010 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
16020 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
16030 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
16040 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
16050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16060 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
16070 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
16080 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
16090 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
160a0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
160b0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
160c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
160d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
160e0 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
160f0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
16100 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
16110 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16120 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16130 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
16140 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
16150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16160 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16170 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
16180 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
16190 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
161a0 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
161b0 20 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b 0a     if( nFarg ){.
161c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
161d0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
161e0 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
161f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
16200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16220 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
16230 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
16240 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
16250 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  CT: {.      test
16260 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
16270 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
16280 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
16290 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e  LECT );.      in
162a0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  Reg = sqlite3Cod
162b0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
162c0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
162d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
162e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
162f0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
16300 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
16310 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16320 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
16330 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
16340 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16350 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
16360 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16370 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
16380 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
16390 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
163a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
163b0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
163c0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
163d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
163e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
163f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16400 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16410 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
16420 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
16430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16440 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
16450 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
16460 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16470 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
16480 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
16490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
164a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
164b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
164c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
164d0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
164e0 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
164f0 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
16500 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
16510 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
16520 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
16530 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
16540 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
16550 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
16560 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
16570 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
16580 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
16590 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
165a0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
165b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
165c0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
165d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
165e0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
165f0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
16600 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
16610 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Item = pExpr->x.
16620 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
16630 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
16640 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  LItem->pExpr;.. 
16650 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16660 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16670 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
16680 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
16690 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
166a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
166b0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
166c0 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
166d0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
166e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
166f0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
16700 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c  ;.      r3 = sql
16710 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16720 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34  Parse);.      r4
16730 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16740 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16750 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
16760 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
16770 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
167a0 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
167b0 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
167c0 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
167d0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
167e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
167f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16800 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
16810 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
16820 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16830 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
16840 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
16850 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
16860 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
16870 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
16880 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
16890 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20  Le, r1, r2, r4, 
168a0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
168b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
168c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
168d0 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67  nd, r3, r4, targ
168e0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
168f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16900 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
16910 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16920 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16930 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , r4);.      bre
16940 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16950 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
16960 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
16970 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
16980 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
16990 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
169a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
169b0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
169c0 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
169d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
169e0 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
169f0 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
16a00 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
16a10 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
16a20 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
16a30 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
16a40 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
16a50 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
16a60 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
16a70 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
16a80 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
16a90 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
16aa0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
16ab0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
16ac0 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
16ad0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
16ae0 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
16af0 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
16b00 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
16b10 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
16b20 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
16b30 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
16b40 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
16b50 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
16b60 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
16b70 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
16b80 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
16b90 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
16ba0 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
16bb0 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
16bc0 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
16bd0 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
16be0 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
16bf0 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
16c00 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
16c10 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
16c20 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
16c30 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
16c40 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
16c50 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
16c60 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
16c70 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
16c80 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
16c90 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
16ca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
16cb0 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
16cc0 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
16cd0 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
16ce0 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
16cf0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
16d00 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
16d10 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
16d20 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
16d30 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
16d40 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
16d50 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
16d60 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
16d70 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
16d80 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
16d90 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
16da0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
16db0 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
16dc0 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
16dd0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
16de0 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
16df0 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
16e00 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
16e10 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
16e20 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
16e30 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
16e40 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
16e50 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
16e60 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
16e70 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
16e80 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
16e90 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
16ea0 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
16eb0 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
16ec0 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
16ed0 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
16ee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
16ef0 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
16f00 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
16f10 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
16f20 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
16f30 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
16f40 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
16f50 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16f60 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
16f70 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
16f80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16f90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
16fa0 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
16fb0 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
16fc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16fd0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
16fe0 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
16ff0 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
17000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17010 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
17020 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
17030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17040 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
17050 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
17060 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
17070 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d  ent((v, "%s.%s -
17080 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20  > $%d",.        
17090 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
170a0 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
170b0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
170c0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
170d0 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
170e0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
170f0 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c  iColumn].zName),
17100 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a  .        target.
17110 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
17120 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
17130 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
17140 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
17150 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
17160 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
17170 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
17180 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
17190 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
171a0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
171b0 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
171c0 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20  s really real.  
171d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  */.      if( pEx
171e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a  pr->iColumn>=0 .
171f0 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e         && pTab->
17200 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
17210 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
17220 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
17230 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17250 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
17260 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20  nity, target);. 
17270 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
17280 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17290 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
172a0 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
172b0 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
172c0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
172d0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
172e0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
172f0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
17300 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
17310 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
17320 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
17330 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
17340 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
17350 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
17360 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
17370 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
17380 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
17390 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
173a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
173b0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
173c0 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
173d0 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
173e0 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
173f0 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
17400 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
17410 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
17420 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
17430 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
17440 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
17450 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20  pExpr->pRight.  
17460 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
17470 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72  tional.  If ther
17480 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45  e is no.    ** E
17490 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  LSE clause and n
174a0 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74  o other term mat
174b0 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ches, then the r
174c0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
174d0 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73   ** exprssion is
174e0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
174f0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
17500 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
17510 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
17520 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
17530 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
17540 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
17550 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
17560 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
17570 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
17580 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
17590 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
175a0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
175b0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
175c0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
175d0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
175e0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
175f0 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
17600 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
17610 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
17640 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
17650 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
17660 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
17690 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
176a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
176b0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
176e0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
176f0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17720 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
17730 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
17760 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
17770 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17780 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
17790 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
177a0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
177b0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
177c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
177d0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
177e0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
177f0 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58       Expr cacheX
17800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17810 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64         /* Cached
17820 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f   expression X */
17830 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17860 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
17870 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
17880 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
17890 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
178a0 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
178b0 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
178c0 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
178d0 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
178e0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
178f0 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
17900 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
17910 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17920 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
17930 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
17940 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17950 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ((pExpr->x.pList
17960 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
17970 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
17980 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
17990 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
179a0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
179b0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
179c0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
179d0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
179e0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
179f0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
17a00 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
17a10 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17a20 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
17a30 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
17a40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
17a50 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
17a60 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
17a70 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
17a80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17a90 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  e( pX->op==TK_RE
17aa0 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
17ab0 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20    cacheX.iTable 
17ac0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17ad0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
17ae0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17af0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17b00 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
17b10 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70         cacheX.op
17b20 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
17b30 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
17b40 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
17b50 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
17b60 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b  pLeft = &cacheX;
17b70 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d  .        pTest =
17b80 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20   &opCompare;.   
17b90 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62       /* Ticket b
17ba0 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65  351d95f9cd5ef17e
17bb0 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31  9d9dbae18f5ca861
17bc0 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20  1190001:.       
17bd0 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e   ** The value in
17be0 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20   regFree1 might 
17bf0 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74  get SCopy-ed int
17c00 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c  o the file resul
17c10 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  t..        ** So
17c20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
17c30 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67  the regFree1 reg
17c40 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75  ister is not reu
17c50 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20  sed for other.  
17c60 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65        ** purpose
17c70 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f  s and possibly o
17c80 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
17c90 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
17ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17cb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17cc0 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
17cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17ce0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
17cf0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
17d00 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
17d10 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
17d20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
17d30 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
17d40 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
17d50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
17d60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
17d70 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
17d80 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
17d90 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
17da0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
17db0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17dc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17dd0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
17de0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
17df0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
17e00 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
17e10 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
17e20 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
17e30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17e40 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
17e50 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
17e60 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
17e70 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
17e80 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
17e90 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
17ea0 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ER );.        sq
17eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
17ec0 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
17ed0 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  i+1].pExpr, targ
17ee0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
17ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17f00 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e  , OP_Goto, 0, en
17f10 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
17f20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17f30 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
17f40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17f50 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17f60 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
17f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17f80 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
17f90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17fa0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
17fb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
17fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
17fd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17fe0 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a  Right, target);.
17ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18000 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
18010 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  se, 1);.      }e
18020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
18030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18040 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
18050 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
18060 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
18070 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
18080 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
18090 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
180a0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
180b0 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
180c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
180d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
180e0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
180f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18100 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18110 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
18120 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
18130 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
18140 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18150 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
18160 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
18170 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18180 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
18190 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
181a0 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
181b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
181c0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
181d0 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
181e0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
181f0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
18200 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18210 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18220 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18230 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
18240 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
18250 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
18260 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
18270 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
18280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18290 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
182a0 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
182b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
182c0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
182d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
182e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
182f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18300 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
18310 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
18320 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
18330 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
18340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18350 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
18360 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
18370 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
18380 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
18390 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en,0);.      }el
183a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
183b0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
183c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
183d0 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72  >affinity, pExpr
183e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
183f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
18400 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
18410 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
18420 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18430 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
18440 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
18450 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18460 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
18470 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
18480 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
18490 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
184a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
184b0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
184c0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
184d0 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
184e0 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
184f0 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
18500 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
18510 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
18520 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
18530 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
18540 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
18550 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
18560 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
18570 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
18580 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
18590 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
185a0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
185b0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
185c0 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  o zero..*/.int s
185d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
185e0 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
185f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
18600 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
18610 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
18620 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
18630 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69  .  int r2 = sqli
18640 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18650 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
18660 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d   r1);.  if( r2==
18670 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20  r1 ){.    *pReg 
18680 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = r1;.  }else{. 
18690 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
186a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
186b0 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20   r1);.    *pReg 
186c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
186d0 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
186e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
186f0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
18700 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
18710 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
18720 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
18730 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
18740 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
18750 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
18760 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
18770 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e  er target..*/.in
18780 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
18790 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
187a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
187b0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
187c0 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
187d0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
187e0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
187f0 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
18800 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
18810 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
18820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18830 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
18840 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
18850 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
18860 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
18870 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
18880 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
18890 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
188a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
188b0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
188c0 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  be || pParse->db
188d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
188e0 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
188f0 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
18900 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
18910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18920 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
18930 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
18940 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
18950 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18960 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  target;.}../*.**
18970 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18980 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65  hat evalutes the
18990 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
189a0 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
189b0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
189c0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
189d0 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
189e0 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
189f0 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
18a00 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
18a10 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
18a20 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
18a30 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
18a40 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
18a50 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
18a60 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
18a70 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
18a80 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
18a90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18aa0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
18ab0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
18ac0 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
18ad0 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
18ae0 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
18af0 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
18b00 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
18b10 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
18b20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
18b30 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
18b40 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
18b50 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
18b60 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
18b70 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
18b80 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
18b90 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20  nReg;.  inReg = 
18ba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
18bb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
18bc0 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
18bd0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
18be0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
18bf0 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65  is called for te
18c00 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72  rms to INSERT or
18c10 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68   UPDATE.  And th
18c20 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  e only.  ** othe
18c30 72 20 70 6c 61 63 65 20 77 68 65 72 65 20 65 78  r place where ex
18c40 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65  pressions can be
18c50 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
18c60 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20  TK_REGISTER is. 
18c70 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61   ** in WHERE cla
18c80 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
18c90 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79   So as currently
18ca0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68   implemented, th
18cb0 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77  ere is.  ** no w
18cc0 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49  ay for a TK_REGI
18cd0 53 54 45 52 20 74 6f 20 65 78 69 73 74 20 68 65  STER to exist he
18ce0 72 65 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d  re.  But it seem
18cf0 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a  s prudent to.  *
18d00 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59  * keep the ALWAY
18d10 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65 20  S() in case the 
18d20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
18d30 20 63 68 61 6e 67 65 20 77 69 74 68 20 66 75 74   change with fut
18d40 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  ure.  ** modific
18d50 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63  ations or enhanc
18d60 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
18d70 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f   ALWAYS(pExpr->o
18d80 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20  p!=TK_REGISTER) 
18d90 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65  ){  .    int iMe
18da0 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b  m;.    iMem = ++
18db0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18dd0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
18de0 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  inReg, iMem);.  
18df0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
18e00 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  = iMem;.    pExp
18e10 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e  r->op2 = pExpr->
18e20 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  op;.    pExpr->o
18e30 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
18e40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e  .  }.  return in
18e50 52 65 67 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Reg;.}..#if defi
18e60 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18e70 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
18e80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
18e90 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
18ea0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
18eb0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
18ec0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
18ed0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 56 64  e3ExplainExpr(Vd
18ee0 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a  be *pOut, Expr *
18ef0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70  pExpr){.  int op
18f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18f10 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
18f20 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
18f30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18f40 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20  BinOp = 0;   /* 
18f50 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20  Binary operator 
18f60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18f70 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f  *zUniOp = 0;   /
18f80 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72  * Unary operator
18f90 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
18fa0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
18fb0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
18fc0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
18fd0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
18fe0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
18ff0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
19000 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19010 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19020 75 74 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22  ut, "AGG{%d:%d}"
19030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ,.            pE
19040 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
19050 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
19060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19070 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
19080 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
19090 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
190a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
190b0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
190c0 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
190d0 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
190e0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
190f0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19100 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29  Out, "COLUMN(%d)
19110 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ", pExpr->iColum
19120 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
19130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19140 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19150 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20  ut, "{%d:%d}",. 
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
19180 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
19190 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
191a0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
191b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
191c0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
191d0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
191e0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
191f0 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
19200 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19210 74 66 28 70 4f 75 74 2c 20 22 25 64 22 2c 20 70  tf(pOut, "%d", p
19220 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
19230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19250 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19260 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%s", pExpr->u.
19270 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
19280 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19290 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
192a0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
192b0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
192c0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
192d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
192e0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22  Printf(pOut,"%s"
192f0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
19300 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
19310 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19320 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
19330 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
19340 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19350 4f 75 74 2c 22 25 51 22 2c 20 70 45 78 70 72 2d  Out,"%Q", pExpr-
19360 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
19370 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19380 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
19390 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
193a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
193b0 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
193c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
193d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
193e0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
193f0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
19400 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
19410 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19420 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d  Out,"%s", pExpr-
19430 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
19440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19450 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
19460 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
19470 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19480 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 56  inPrintf(pOut,"V
19490 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c  ARIABLE(%s,%d)",
194a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194b0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
194c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78  r->u.zToken, pEx
194d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
194e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
194f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
19500 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
19510 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
19520 6e 74 66 28 70 4f 75 74 2c 22 52 45 47 49 53 54  ntf(pOut,"REGIST
19530 45 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e  ER(%d)", pExpr->
19540 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
19550 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19560 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
19570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19580 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
19590 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
195a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
195b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
195c0 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
195d0 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
195e0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
195f0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
19600 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
19610 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ken) */.      co
19620 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  nst char *zAff =
19630 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77   "unk";.      sw
19640 69 74 63 68 28 20 73 71 6c 69 74 65 33 41 66 66  itch( sqlite3Aff
19650 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
19660 3e 75 2e 7a 54 6f 6b 65 6e 29 20 29 7b 0a 20 20  >u.zToken) ){.  
19670 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
19680 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20 7a  E_AFF_TEXT:    z
19690 41 66 66 20 3d 20 22 54 45 58 54 22 3b 20 20 20  Aff = "TEXT";   
196a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
196b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
196c0 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d  _NONE:    zAff =
196d0 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62 72 65   "NONE";     bre
196e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
196f0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
19700 52 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d  RIC: zAff = "NUM
19710 45 52 49 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ERIC";  break;. 
19720 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
19730 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20  TE_AFF_INTEGER: 
19740 7a 41 66 66 20 3d 20 22 49 4e 54 45 47 45 52 22  zAff = "INTEGER"
19750 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
19760 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
19770 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66 66 20  F_REAL:    zAff 
19780 3d 20 22 52 45 41 4c 22 3b 20 20 20 20 20 62 72  = "REAL";     br
19790 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
197a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
197b0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43  nPrintf(pOut, "C
197c0 41 53 54 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b  AST-%s(", zAff);
197d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
197e0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
197f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19800 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19810 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
19820 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
19830 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
19840 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
19850 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
19860 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_LT:      zBin
19870 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 62  Op = "LT";     b
19880 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
19890 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_LE:      zBinO
198a0 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62 72  p = "LE";     br
198b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
198c0 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _GT:      zBinOp
198d0 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72 65   = "GT";     bre
198e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
198f0 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  GE:      zBinOp 
19900 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72 65 61  = "GE";     brea
19910 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
19920 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
19930 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "NE";     break
19940 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
19950 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
19960 22 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "EQ";     break;
19970 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
19980 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
19990 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IS";     break;.
199a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
199b0 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49  T:   zBinOp = "I
199c0 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SNOT";  break;. 
199d0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
199e0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e      zBinOp = "AN
199f0 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
19a00 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
19a10 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22     zBinOp = "OR"
19a20 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19a30 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
19a40 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44 22    zBinOp = "ADD"
19a50 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
19a60 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
19a70 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b   zBinOp = "MUL";
19a80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19a90 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20  ase TK_MINUS:   
19aa0 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20  zBinOp = "SUB"; 
19ab0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19ac0 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
19ad0 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20  BinOp = "REM";  
19ae0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
19af0 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42  e TK_BITAND:  zB
19b00 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b  inOp = "BITAND";
19b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19b20 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69   TK_BITOR:   zBi
19b30 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20  nOp = "BITOR";  
19b40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19b50 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e  TK_SLASH:   zBin
19b60 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 62  Op = "DIV";    b
19b70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
19b80 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f  K_LSHIFT:  zBinO
19b90 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62 72  p = "LSHIFT"; br
19ba0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
19bb0 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70  _RSHIFT:  zBinOp
19bc0 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72 65   = "RSHIFT"; bre
19bd0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
19be0 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20  CONCAT:  zBinOp 
19bf0 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65 61  = "CONCAT"; brea
19c00 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  k;..    case TK_
19c10 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20  UMINUS:  zUniOp 
19c20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61  = "UMINUS"; brea
19c30 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
19c40 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d  PLUS:   zUniOp =
19c50 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b   "UPLUS";  break
19c60 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
19c70 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  TNOT:  zUniOp = 
19c80 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b  "BITNOT"; break;
19c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
19ca0 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22  :     zUniOp = "
19cb0 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NOT";    break;.
19cc0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
19cd0 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49  LL:  zUniOp = "I
19ce0 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20  SNULL"; break;. 
19cf0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
19d00 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f  LL: zUniOp = "NO
19d10 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
19d20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
19d30 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
19d40 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
19d50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
19d60 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
19d70 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
19d80 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
19d90 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
19da0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ents */.      if
19db0 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
19dc0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
19dd0 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
19de0 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
19df0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19e00 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
19e10 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
19e20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19e30 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19e40 70 4f 75 74 2c 20 22 25 73 46 55 4e 43 54 49 4f  pOut, "%sFUNCTIO
19e50 4e 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20 20  N:%s(",.        
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 20 20 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55     op==TK_AGG_FU
19e80 4e 43 54 49 4f 4e 20 3f 20 22 41 47 47 5f 22 20  NCTION ? "AGG_" 
19e90 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  : "",.          
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
19ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 61  );.      if( pFa
19ed0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rg ){.        sq
19ee0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
19ef0 4c 69 73 74 28 70 4f 75 74 2c 20 70 46 61 72 67  List(pOut, pFarg
19f00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19f10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19f20 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
19f30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19f40 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
19f50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19f60 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
19f70 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  ISTS: {.      sq
19f80 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19f90 74 66 28 70 4f 75 74 2c 20 22 45 58 49 53 54 53  tf(pOut, "EXISTS
19fa0 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
19fb0 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28  e3ExplainSelect(
19fc0 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pOut, pExpr->x.p
19fd0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
19fe0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
19ff0 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20  ntf(pOut,")");. 
1a000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a010 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  }.    case TK_SE
1a020 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LECT: {.      sq
1a030 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a040 74 66 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20  tf(pOut, "(");. 
1a050 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a060 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1a070 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1a080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a090 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a0a0 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20  ut, ")");.      
1a0b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a0c0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1a0d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a0e0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a0f0 22 49 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71  "IN(");.      sq
1a100 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1a110 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1a120 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1a130 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a140 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  (pOut, ",");.   
1a150 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1a160 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1a170 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1a180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a190 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74  plainSelect(pOut
1a1a0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
1a1b0 63 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ct);.      }else
1a1c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a1d0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
1a1e0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1a1f0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
1a200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a210 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a220 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1a230 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1a240 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1a250 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
1a260 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
1a270 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1a280 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1a290 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
1a2a0 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
1a2b0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
1a2c0 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
1a2d0 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
1a2e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
1a2f0 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
1a300 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1a310 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
1a320 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
1a330 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1a340 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
1a350 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
1a360 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1a370 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78    Expr *pX = pEx
1a380 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1a390 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70   Expr *pY = pExp
1a3a0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1a3b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1a3c0 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e  pr *pZ = pExpr->
1a3d0 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
1a3e0 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
1a3f0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a400 70 4f 75 74 2c 20 22 42 45 54 57 45 45 4e 28 22  pOut, "BETWEEN("
1a410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a420 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1a430 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pX);.      sql
1a440 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a450 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1a460 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a470 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 59 29  inExpr(pOut, pY)
1a480 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a490 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a4a0 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1a4b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1a4c0 72 28 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20  r(pOut, pZ);.   
1a4d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a4e0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1a4f0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1a500 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a510 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
1a520 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
1a530 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
1a540 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
1a550 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
1a560 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
1a570 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
1a580 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
1a590 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
1a5a0 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
1a5b0 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
1a5c0 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
1a5d0 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
1a5e0 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
1a5f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
1a600 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
1a610 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
1a620 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1a630 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
1a640 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
1a650 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
1a660 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
1a670 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
1a680 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
1a690 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
1a6a0 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ield..      */. 
1a6b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a6c0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a6d0 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20  "%s(%d)", .     
1a6e0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
1a6f0 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c  le ? "NEW" : "OL
1a700 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  D", pExpr->iColu
1a710 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1a720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a730 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
1a740 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a750 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41  Printf(pOut, "CA
1a760 53 45 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  SE(");.      sql
1a770 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1a780 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1a790 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
1a7a0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a7b0 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1a7c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a7d0 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70  ExprList(pOut, p
1a7e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
1a7f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a800 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1a810 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1a820 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
1a830 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
1a840 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75  char *zType = "u
1a850 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63  nk";.      switc
1a860 68 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  h( pExpr->affini
1a870 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  ty ){.        ca
1a880 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20  se OE_Rollback: 
1a890 20 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62    zType = "rollb
1a8a0 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ack";  break;.  
1a8b0 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62        case OE_Ab
1a8c0 6f 72 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20  ort:      zType 
1a8d0 3d 20 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62  = "abort";     b
1a8e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1a8f0 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20  se OE_Fail:     
1a900 20 20 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22    zType = "fail"
1a910 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1a920 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
1a930 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20  nore:     zType 
1a940 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62  = "ignore";    b
1a950 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a960 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a970 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1a980 52 41 49 53 45 2d 25 73 28 25 73 29 22 2c 20 7a  RAISE-%s(%s)", z
1a990 54 79 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  Type, pExpr->u.z
1a9a0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1a9b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1a9c0 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e  f.  }.  if( zBin
1a9d0 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1a9e0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a9f0 4f 75 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f  Out,"%s(", zBinO
1aa00 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
1aa10 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1aa20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1aa30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1aa40 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c  inPrintf(pOut,",
1aa50 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
1aa60 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1aa70 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1aa80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1aa90 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1aaa0 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  )");.  }else if(
1aab0 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73   zUniOp ){.    s
1aac0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1aad0 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20  ntf(pOut,"%s(", 
1aae0 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c  zUniOp);.    sql
1aaf0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1ab00 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1ab10 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1ab20 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ab30 75 74 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23  ut,")");.  }.}.#
1ab40 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1ab50 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
1ab60 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a  REE_EXPLAIN) */.
1ab70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1ab80 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
1ab90 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
1aba0 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
1abb0 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61  readable explana
1abc0 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65  tion of an expre
1abd0 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
1abe0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61  oid sqlite3Expla
1abf0 69 6e 45 78 70 72 4c 69 73 74 28 56 64 62 65 20  inExprList(Vdbe 
1ac00 2a 70 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20  *pOut, ExprList 
1ac10 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1ac20 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ac30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
1ac40 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1ac50 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ac60 70 4f 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69  pOut, "(empty-li
1ac70 73 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72  st)");.    retur
1ac80 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  n;.  }else if( p
1ac90 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
1aca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1acb0 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1acc0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1acd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ace0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
1acf0 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f  sh(pOut);.    fo
1ad00 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1ad10 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1ad20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ad30 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 69  nPrintf(pOut, "i
1ad40 74 65 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b  tem[%d] = ", i);
1ad50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ad60 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b  plainPush(pOut);
1ad70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ad80 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1ad90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1ada0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
1adb0 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74  3ExplainPop(pOut
1adc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70  );.      if( i<p
1add0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b  List->nExpr-1 ){
1ade0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1adf0 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b  ExplainNL(pOut);
1ae00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ae10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ae20 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a  nPop(pOut);.  }.
1ae30 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ae40 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
1ae50 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1ae60 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f  f pExpr is an co
1ae70 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
1ae80 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  n that is approp
1ae90 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63  riate.** for fac
1aea0 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20  toring out of a 
1aeb0 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61  loop.  Appropria
1aec0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  te expressions a
1aed0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  re:.**.**    *  
1aee0 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
1aef0 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f  hat evaluates to
1af00 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63   two or more opc
1af10 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  odes..**.**    *
1af20 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72    Any OP_Integer
1af30 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74  , OP_Real, OP_St
1af40 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f  ring, OP_Blob, O
1af50 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20  P_Null, .**     
1af60 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65    or OP_Variable
1af70 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
1af80 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64  eed to be placed
1af90 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20   in a .**       
1afa0 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74 65  specific registe
1afb0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
1afc0 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61  s no point in fa
1afd0 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67  ctoring out sing
1afe0 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  le-instruction c
1aff0 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65  onstant.** expre
1b000 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64  ssions that need
1b010 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e   to be placed in
1b020 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
1b030 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20  gister.  .** We 
1b040 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65  could factor the
1b050 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20  m out, but then 
1b060 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20  we would end up 
1b070 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f  adding an.** OP_
1b080 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f  SCopy instructio
1b090 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61  n to move the va
1b0a0 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  lue into the cor
1b0b0 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  rect register.**
1b0c0 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68   later.  We migh
1b0d0 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75  t as well just u
1b0e0 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
1b0f0 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a  instruction and.
1b100 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f  ** avoid the OP_
1b110 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  SCopy..*/.static
1b120 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61   int isAppropria
1b130 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45  teForFactoring(E
1b140 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21  xpr *p){.  if( !
1b150 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1b160 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20  stantNotJoin(p) 
1b170 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1b180 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61    /* Only consta
1b190 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  nt expressions a
1b1a0 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
1b1b0 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a  or factoring */.
1b1c0 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c    }.  if( (p->fl
1b1d0 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44 65  ags & EP_FixedDe
1b1e0 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  st)==0 ){.    re
1b1f0 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20  turn 1;  /* Any 
1b200 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74  constant without
1b210 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
1b220 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69  tion is appropri
1b230 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69  ate */.  }.  whi
1b240 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
1b250 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65  LUS ) p = p->pLe
1b260 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  ft;.  switch( p-
1b270 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  >op ){.#ifndef S
1b280 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1b290 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1b2a0 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66   TK_BLOB:.#endif
1b2b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
1b2c0 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  IABLE:.    case 
1b2d0 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
1b2e0 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
1b2f0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1b300 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1b310 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ING: {.      tes
1b320 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1b330 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74  _BLOB );.      t
1b340 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
1b350 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20  TK_VARIABLE );. 
1b360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b370 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
1b380 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b390 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  se( p->op==TK_FL
1b3a0 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  OAT );.      tes
1b3b0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1b3c0 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  _NULL );.      t
1b3d0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
1b3e0 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20  TK_STRING );.   
1b3f0 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73     /* Single-ins
1b400 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e  truction constan
1b410 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64 20  ts with a fixed 
1b420 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a  destination are.
1b430 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
1b440 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49  done in-line.  I
1b450 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d  f we factor them
1b460 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74  , they will just
1b470 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70   end.      ** up
1b480 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f   generating an O
1b490 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20  P_SCopy to move 
1b4a0 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65  the value to the
1b4b0 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20   destination.   
1b4c0 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20     ** register. 
1b4d0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1b4e0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  0;.    }.    cas
1b4f0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
1b500 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
1b510 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
1b520 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  || p->pLeft->op=
1b530 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
1b540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1b550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1b560 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b570 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1b580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b590 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
1b5a0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
1b5b0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
1b5c0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
1b5d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1b5e0 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75  .** factoring ou
1b5f0 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65  t of a loop, the
1b600 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65  n evaluate the e
1b610 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74  xpression.** int
1b620 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
1b630 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
1b640 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54  ression into a T
1b650 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78  K_REGISTER.** ex
1b660 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
1b670 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73  tic int evalCons
1b680 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57  tExpr(Walker *pW
1b690 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
1b6a0 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
1b6b0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
1b6c0 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68  pParse;.  switch
1b6d0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
1b6e0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
1b6f0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
1b700 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TER: {.      ret
1b710 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1b720 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1b730 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
1b740 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
1b750 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
1b760 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20  _CONST_FUNC: {. 
1b770 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75       /* The argu
1b780 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74  ments to a funct
1b790 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65 64  ion have a fixed
1b7a0 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
1b7b0 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d      ** Mark them
1b7c0 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f   this way to avo
1b7d0 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e  id generated unn
1b7e0 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20  eeded OP_SCopy. 
1b7f0 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
1b800 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ions. .      */.
1b810 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1b820 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
1b830 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73  .pList;.      as
1b840 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1b850 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1b860 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1b870 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29       if( pList )
1b880 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
1b890 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1b8a0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
1b8b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1b8c0 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a  tem = pList->a;.
1b8d0 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e          for(; i>
1b8e0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1b8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1b900 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70 45  ALWAYS(pItem->pE
1b910 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70 45  xpr) ) pItem->pE
1b920 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
1b930 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20  _FixedDest;.    
1b940 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b960 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70  .  }.  if( isApp
1b970 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
1b980 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20  ring(pExpr) ){. 
1b990 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50     int r1 = ++pP
1b9a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1b9b0 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d  int r2;.    r2 =
1b9c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b9d0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1b9e0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
1b9f0 66 28 20 4e 45 56 45 52 28 72 31 21 3d 72 32 29  f( NEVER(r1!=r2)
1ba00 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
1ba10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1ba20 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d   r1);.    pExpr-
1ba30 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
1ba40 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
1ba50 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1ba60 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1ba70 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
1ba80 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
1ba90 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1baa0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1bab0 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
1bac0 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
1bad0 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
1bae0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
1baf0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
1bb00 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
1bb10 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
1bb20 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
1bb30 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
1bb40 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
1bb50 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
1bb60 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
1bb70 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  ed values..**.**
1bb80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1bb90 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1bba0 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f 6f 6b  jump to the cook
1bbb0 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20 68 61  ie-check code ha
1bbc0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
1bbd0 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65 20 63  ur.  Since the c
1bbe0 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75 6d 70  ookie-check jump
1bbf0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 70 72   is generated pr
1bc00 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20 6f 74  ior to.** any ot
1bc10 68 65 72 20 73 65 72 69 6f 75 73 20 70 72 6f 63  her serious proc
1bc20 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63 68 65  essing, this che
1bc30 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ck ensures that 
1bc40 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 77  there is no.** w
1bc50 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74 6c 79  ay to accidently
1bc60 20 62 79 70 61 73 73 20 74 68 65 20 63 6f 6e 73   bypass the cons
1bc70 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  tant initializat
1bc80 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
1bc90 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 73 6f   routine is also
1bca0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1bcb0 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
1bcc0 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61 74 69  Const optimizati
1bcd0 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  on.** is disable
1bce0 64 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  d via the sqlite
1bcf0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1bd00 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1bd10 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a 2a 2a  PTIMIZATIONS).**
1bd20 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 69   interface.  Thi
1bd30 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20 6c 6f  s allows test lo
1bd40 67 69 63 20 74 6f 20 76 65 72 69 66 79 20 74 68  gic to verify th
1bd50 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1bd60 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  er is.** obtaine
1bd70 64 20 66 6f 72 20 71 75 65 72 69 65 73 20 72 65  d for queries re
1bd80 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1bd90 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e 73 74  her or not const
1bda0 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72 65 63  ants are.** prec
1bdb0 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65 67  omputed into reg
1bdc0 69 73 74 65 72 73 20 6f 72 20 69 66 20 74 68 65  isters or if the
1bdd0 79 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  y are inserted i
1bde0 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n-line..*/.void 
1bdf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1be00 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
1be10 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1be20 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
1be30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1be40 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72 65 74  cookieGoto ) ret
1be50 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 50 61 72  urn;.  if( (pPar
1be60 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1be70 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
1be80 43 6f 6e 73 74 29 21 3d 30 20 29 20 72 65 74 75  Const)!=0 ) retu
1be90 72 6e 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  rn;.  w.xExprCal
1bea0 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73  lback = evalCons
1beb0 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65  tExpr;.  w.xSele
1bec0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
1bed0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
1bee0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
1bef0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
1bf00 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  );.}.../*.** Gen
1bf10 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1bf20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
1bf30 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
1bf40 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
1bf50 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
1bf60 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
1bf70 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
1bf80 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
1bf90 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
1bfa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1bfb0 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
1bfc0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1bfd0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1bfe0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1bff0 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
1c000 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c010 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1c020 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1c030 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
1c040 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
1c050 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
1c060 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
1c070 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
1c080 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20   doHardCopy     
1c090 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63  /* Make a hard c
1c0a0 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65  opy of every ele
1c0b0 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ment */.){.  str
1c0c0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c0d0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1c0e0 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  i, n;.  assert( 
1c0f0 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
1c100 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1c110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1c120 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20  se->pVdbe!=0 ); 
1c130 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74   /* Never gets t
1c140 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73  his far otherwis
1c150 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74  e */.  n = pList
1c160 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
1c170 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1c180 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
1c190 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
1c1a0 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d   *pExpr = pItem-
1c1b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  >pExpr;.    int 
1c1c0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1c1d0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1c1e0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1c1f0 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66 28 20  get+i);.    if( 
1c200 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
1c210 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c220 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1c230 65 2d 3e 70 56 64 62 65 2c 20 64 6f 48 61 72 64  e->pVdbe, doHard
1c240 43 6f 70 79 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  Copy ? OP_Copy :
1c250 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20   OP_SCopy,.     
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 20 20 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74     inReg, target
1c280 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +i);.    }.  }. 
1c290 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1c2a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c2b0 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
1c2c0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1c2d0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1c2e0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
1c2f0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
1c300 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
1c310 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
1c320 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
1c330 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1c340 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1c350 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1c360 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20  ** elementation 
1c370 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
1c380 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
1c390 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
1c3a0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1c3b0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1c3c0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1c3d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1c3e0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
1c3f0 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
1c400 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
1c410 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1c420 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
1c430 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
1c440 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
1c450 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1c460 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1c470 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
1c480 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1c490 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1c4a0 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1c4b0 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1c4c0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
1c4d0 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
1c4e0 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
1c4f0 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
1c500 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
1c510 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
1c520 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
1c530 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
1c540 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
1c550 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
1c560 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
1c570 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1c580 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1c590 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
1c5a0 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
1c5b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
1c5c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c5d0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1c5e0 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
1c5f0 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
1c600 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1c610 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
1c620 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1c630 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
1c640 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1c650 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
1c660 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
1c670 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1c680 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
1c690 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1c6a0 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1c6b0 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1c6c0 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1c6d0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1c6e0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1c6f0 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1c700 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1c710 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 58  ].pExpr;.  exprX
1c720 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
1c730 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c740 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
1c750 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78 70 72  egFree1);.  expr
1c760 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
1c770 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66  ER;.  if( jumpIf
1c780 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  True ){.    sqli
1c790 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1c7a0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1c7b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1c7c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c7d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1c7e0 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  se(pParse, &expr
1c7f0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
1c800 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
1c810 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1c820 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1c830 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
1c840 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
1c850 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
1c860 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1c870 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1c880 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1c890 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1c8a0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1c8b0 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1c8c0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1c8d0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1c8e0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1c8f0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1c900 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1c910 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1c920 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1c930 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1c940 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1c950 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1c960 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1c970 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1c980 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1c990 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1c9a0 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1c9b0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1c9c0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1c9d0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1c9e0 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1c9f0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1ca00 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1ca10 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1ca20 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1ca30 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1ca40 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
1ca50 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1ca60 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1ca70 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1ca80 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1ca90 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1caa0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1cab0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
1cac0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1cad0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1cae0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1caf0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1cb00 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
1cb10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1cb20 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1cb30 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1cb40 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
1cb50 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
1cb60 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
1cb70 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
1cb80 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
1cb90 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
1cba0 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
1cbb0 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
1cbc0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
1cbd0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
1cbe0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
1cbf0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
1cc00 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
1cc10 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
1cc20 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
1cc30 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
1cc40 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
1cc50 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
1cc60 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
1cc70 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
1cc80 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
1cc90 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
1cca0 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
1ccb0 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
1ccc0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
1ccd0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
1cce0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
1ccf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1cd00 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
1cd10 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1cd20 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
1cd30 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
1cd40 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1cd50 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1cd60 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
1cd70 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
1cd80 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
1cd90 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
1cda0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
1cdb0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
1cdc0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
1cdd0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
1cde0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
1cdf0 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
1ce00 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45  xistance of VDBE
1ce10 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1ce20 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
1ce30 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
1ce40 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
1ce50 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
1ce60 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
1ce70 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
1ce80 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1ce90 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
1cea0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
1ceb0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1cec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ced0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1cee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cef0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1cf00 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1cf10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1cf20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1cf30 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
1cf40 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1cf50 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1cf60 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1cf70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1cf80 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1cf90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1cfa0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1cfb0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1cfc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1cfd0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1cfe0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1cff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d000 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1d010 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d020 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1d030 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1d040 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1d050 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1d060 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1d070 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1d080 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1d090 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1d0a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d0b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d0c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1d0d0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1d0e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1d0f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1d100 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1d110 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d120 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1d130 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1d140 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d150 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1d160 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1d170 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1d180 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1d190 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1d1a0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1d1b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1d1c0 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
1d1d0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
1d1e0 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
1d1f0 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
1d200 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
1d210 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
1d220 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d230 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
1d240 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d250 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
1d260 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d270 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1d280 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d290 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1d2a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d2b0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1d2c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1d2d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d2e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1d2f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d300 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1d310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1d320 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1d330 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1d340 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d350 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d360 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1d370 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1d380 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d390 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d3a0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1d3b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1d3c0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1d3d0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1d3e0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d400 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1d410 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1d420 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1d430 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1d440 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1d450 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1d460 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d470 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1d480 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1d490 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d4a0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1d4b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d4c0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1d4d0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1d4e0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1d4f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1d500 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1d510 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1d520 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1d530 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1d540 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1d550 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1d560 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1d570 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
1d580 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1d590 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1d5a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1d5b0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1d5c0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1d5d0 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1d5e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d5f0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1d600 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d610 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1d620 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d630 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d640 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1d650 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1d660 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d670 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1d680 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
1d690 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1d6a0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
1d6b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d6c0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1d6d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d6e0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1d6f0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1d700 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d710 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1d720 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1d730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d740 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1d750 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
1d760 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1d770 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1d780 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1d790 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1d7a0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1d7b0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1d7c0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1d7d0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1d7e0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1d7f0 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  1, jumpIfNull);.
1d800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d810 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1d820 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1d830 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1d840 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
1d850 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
1d860 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1d870 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
1d880 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
1d890 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
1d8a0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
1d8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d8c0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1d8d0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
1d8e0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1d8f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d900 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1d910 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
1d920 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1d930 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1d940 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62  fFalse);.      b
1d950 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1d960 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1d970 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
1d980 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1d990 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d9a0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1d9b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d9c0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
1d9d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1d9e0 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65  ll!=0);.      te
1d9f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1da00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1da10 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1da20 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  l==0 );.      br
1da30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1da40 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1da50 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1da60 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1da70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1da80 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1da90 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
1daa0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1dab0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
1dac0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
1dad0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
1dae0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
1daf0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
1db00 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
1db10 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1db20 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1db30 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1db40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1db50 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
1db60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
1db70 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
1db80 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
1db90 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
1dba0 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
1dbb0 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
1dbc0 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
1dbd0 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
1dbe0 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
1dbf0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1dc00 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
1dc10 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1dc20 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
1dc30 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1dc40 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1dc50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1dc60 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
1dc70 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1dc80 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1dc90 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
1dca0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
1dcb0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
1dcc0 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
1dcd0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1dce0 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
1dcf0 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
1dd00 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stance of VDBE c
1dd10 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
1dd20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
1dd30 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
1dd40 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
1dd50 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
1dd60 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
1dd70 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
1dd80 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
1dd90 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
1dda0 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
1ddb0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
1ddc0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
1ddd0 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
1dde0 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
1ddf0 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
1de00 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
1de10 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
1de20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
1de30 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
1de40 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
1de50 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
1de60 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
1de70 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
1de80 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
1de90 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
1dea0 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
1deb0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
1ded0 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1dee0 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
1def0 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
1df00 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
1df10 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
1df20 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
1df30 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
1df40 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
1df50 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1df60 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
1df70 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
1df80 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
1df90 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
1dfa0 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
1dfb0 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
1dfc0 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
1dfd0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1dfe0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
1dff0 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
1e000 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
1e010 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
1e020 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
1e030 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
1e040 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
1e050 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
1e060 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
1e070 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1e080 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
1e090 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
1e0a0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1e0b0 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
1e0c0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
1e0d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1e0e0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
1e0f0 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
1e100 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e110 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
1e120 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
1e130 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1e140 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
1e150 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
1e160 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
1e170 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
1e180 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1e190 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
1e1a0 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
1e1b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1e1c0 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
1e1d0 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
1e1e0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
1e1f0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1e200 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e210 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e230 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1e240 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e250 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e260 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1e270 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1e280 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1e290 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1e2a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1e2b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e2c0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
1e2d0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1e2e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e2f0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1e300 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e310 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e320 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1e330 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1e340 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1e350 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e360 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
1e370 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1e380 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1e390 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1e3a0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1e3b0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1e3c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e3d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1e3e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1e3f0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1e400 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1e410 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
1e420 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e430 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1e440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e450 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e470 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1e480 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1e490 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e4a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e4b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e4c0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1e4d0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1e4e0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1e4f0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1e500 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1e510 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _EQ: {.      tes
1e520 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
1e530 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e540 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
1e550 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e560 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
1e570 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e580 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
1e590 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e5a0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
1e5b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1e5c0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1e5d0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e5e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
1e5f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e600 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e610 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1e620 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1e630 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e640 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e650 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1e660 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
1e670 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1e680 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e690 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e6a0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1e6b0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1e6c0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1e6d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e6e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e6f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e700 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1e710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e720 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1e730 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1e740 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1e750 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1e760 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
1e770 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1e780 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
1e790 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e7a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e7b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e7c0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e7d0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1e7e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e7f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e800 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1e810 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1e820 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
1e830 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
1e840 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  EQ;.      codeCo
1e850 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1e860 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1e870 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1e8a0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1e8b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e8c0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e8d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e8e0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1e8f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e900 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1e910 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1e920 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1e930 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e940 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1e950 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e960 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1e970 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e980 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e990 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e9a0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1e9b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e9c0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1e9d0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
1e9e0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e9f0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1ea00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ea10 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1ea20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1ea30 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ea40 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
1ea50 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
1ea60 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c   pExpr, dest, 0,
1ea70 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ea80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ea90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1eaa0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1eab0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1eac0 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
1ead0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
1eae0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1eaf0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1eb00 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
1eb10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
1eb30 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
1eb40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1eb50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1eb60 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1eb70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
1eb80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
1eb90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1eba0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1ebb0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
1ebc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ebd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1ebe0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1ebf0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ec00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ec10 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1ec20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1ec30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ec40 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
1ec50 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
1ec60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ec70 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ec80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ec90 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1eca0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ecb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ecc0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1ecd0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1ece0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1ecf0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1ed00 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
1ed10 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
1ed20 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
1ed30 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
1ed40 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
1ed50 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
1ed60 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
1ed70 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
1ed80 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
1ed90 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
1eda0 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
1edb0 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
1edc0 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
1edd0 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
1ede0 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
1edf0 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
1ee00 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
1ee10 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
1ee20 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
1ee30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1ee40 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
1ee50 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
1ee60 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
1ee70 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
1ee80 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
1ee90 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
1eea0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
1eeb0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
1eec0 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
1eed0 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
1eee0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1eef0 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
1ef00 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
1ef10 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
1ef20 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
1ef30 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1ef40 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
1ef50 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
1ef60 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
1ef70 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
1ef80 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
1ef90 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
1efa0 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
1efb0 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
1efc0 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
1efd0 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
1efe0 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
1eff0 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
1f000 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
1f010 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
1f020 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
1f030 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
1f040 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
1f050 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
1f060 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
1f070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1f080 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
1f090 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
1f0a0 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
1f0b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1f0c0 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
1f0d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45 78   }.  assert( !Ex
1f0e0 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1f0f0 28 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (pA, EP_TokenOnl
1f100 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1f110 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
1f120 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1f130 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  B, EP_TokenOnly|
1f140 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1f150 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1f160 65 72 74 79 28 70 41 2c 20 45 50 5f 78 49 73 53  erty(pA, EP_xIsS
1f170 65 6c 65 63 74 29 20 7c 7c 20 45 78 70 72 48 61  elect) || ExprHa
1f180 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
1f190 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1f1a0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1f1b0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
1f1c0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
1f1d0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
1f1e0 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
1f1f0 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41  turn 2;.  if( pA
1f200 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
1f210 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1f220 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1f230 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
1f240 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
1f250 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   2;.  if( sqlite
1f260 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
1f270 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
1f280 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  ght) ) return 2;
1f290 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1f2a0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
1f2b0 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
1f2c0 2e 70 4c 69 73 74 29 20 29 20 72 65 74 75 72 6e  .pList) ) return
1f2d0 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   2;.  if( pA->iT
1f2e0 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
1f2f0 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21   || pA->iColumn!
1f300 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
1f310 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 45  eturn 2;.  if( E
1f320 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f330 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  A, EP_IntValue) 
1f340 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  ){.    if( !Expr
1f350 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20  HasProperty(pB, 
1f360 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20  EP_IntValue) || 
1f370 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42  pA->u.iValue!=pB
1f380 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
1f390 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
1f3a0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1f3b0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
1f3c0 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
1f3d0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  n ){.    if( Exp
1f3e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
1f3f0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
1f400 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f   NEVER(pB->u.zTo
1f410 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ken==0) ) return
1f420 20 32 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63   2;.    if( strc
1f430 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
1f440 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
1f450 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f460 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
1f470 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
1f480 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21   EP_ExpCollate)!
1f490 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
1f4a0 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 20 72  _ExpCollate) ) r
1f4b0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 28  eturn 1;.  if( (
1f4c0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pA->flags & EP_E
1f4d0 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20 26 26  xpCollate)!=0 &&
1f4e0 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d 3e   pA->pColl!=pB->
1f4f0 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20 32  pColl ) return 2
1f500 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1f510 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1f520 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
1f530 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
1f540 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
1f550 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
1f560 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
1f570 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
1f580 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f590 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
1f5a0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
1f5b0 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
1f5c0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
1f5d0 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
1f5e0 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
1f5f0 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
1f600 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
1f610 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
1f620 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
1f630 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
1f640 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
1f650 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
1f660 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1f670 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1f680 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
1f690 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
1f6a0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
1f6b0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
1f6c0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
1f6d0 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
1f6e0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1f6f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1f700 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
1f710 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
1f720 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1f730 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
1f740 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1f750 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
1f760 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1f770 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
1f780 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
1f790 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
1f7a0 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
1f7b0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1f7c0 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
1f7d0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
1f7e0 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
1f7f0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1f800 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72   pA->a[i].sortOr
1f810 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  der!=pB->a[i].so
1f820 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
1f830 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
1f840 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1f850 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20 29  ExprA, pExprB) )
1f860 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1f870 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1f880 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
1f890 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
1f8a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
1f8b0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
1f8c0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1f8d0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
1f8e0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1f8f0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
1f900 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
1f910 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
1f920 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
1f930 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
1f940 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
1f950 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
1f960 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1f970 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
1f980 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
1f990 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
1f9a0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
1f9b0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
1f9c0 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
1f9d0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
1f9e0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
1f9f0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
1fa00 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
1fa10 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
1fa20 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
1fa30 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1fa40 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
1fa50 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1fa60 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
1fa70 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
1fa80 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
1fa90 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
1faa0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
1fab0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
1fac0 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
1fad0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1fae0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
1faf0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
1fb00 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
1fb10 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
1fb20 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
1fb30 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
1fb40 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
1fb50 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
1fb60 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
1fb70 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
1fb80 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
1fb90 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
1fba0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
1fbb0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1fbc0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
1fbd0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1fbe0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
1fbf0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1fc00 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
1fc10 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
1fc20 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
1fc30 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
1fc40 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
1fc50 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
1fc60 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
1fc70 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
1fc80 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
1fc90 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
1fca0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
1fcb0 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
1fcc0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1fcd0 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
1fce0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
1fcf0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1fd00 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1fd10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1fd20 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
1fd30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1fd40 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1fd50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1fd60 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1fd70 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
1fd80 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1fd90 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
1fda0 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
1fdb0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
1fdc0 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
1fdd0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
1fde0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
1fdf0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
1fe00 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
1fe10 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
1fe20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1fe30 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
1fe40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1fe50 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
1fe60 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1fe70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
1fe80 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1fe90 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
1fea0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1feb0 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
1fec0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1fed0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1fee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
1fef0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
1ff00 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
1ff10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1ff20 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1ff30 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
1ff40 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
1ff50 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
1ff60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1ff70 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
1ff80 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
1ff90 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
1ffc0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
1ffd0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
1ffe0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
1fff0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
20000 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
20010 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
20020 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
20030 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
20040 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
20050 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
20060 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
20070 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
20080 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
20090 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
200a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
200b0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
200c0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
200d0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
200e0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
200f0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
20100 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
20110 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20120 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20130 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20140 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
20150 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
20160 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
20170 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
20180 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
20190 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
201a0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
201b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
201c0 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
201d0 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
201e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
201f0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
20200 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
20210 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
20220 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
20240 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
20250 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
20260 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
20270 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
20280 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
20290 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
202a0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
202b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
202c0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
202d0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
202e0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
202f0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
20300 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20310 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
20320 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
20330 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
20340 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
20350 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
20360 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
20370 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20390 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
203c0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
203e0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
203f0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
20400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
20410 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
20420 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
20430 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
20460 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
20470 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
20480 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
20490 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
204a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
204b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
204d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
204e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
204f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
20500 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
20510 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
20530 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
20540 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
20550 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
20570 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20590 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
205a0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
205b0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
205c0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
205d0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
205e0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
205f0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
20600 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
20610 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
20620 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
20630 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
20640 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
20650 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
20660 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
20670 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
20680 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
20690 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
206a0 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
206b0 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
206c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
206d0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
206e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
206f0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
20700 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
20710 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
20720 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
20730 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20740 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
20750 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
20760 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
20770 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
20780 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
20790 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
207a0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
207b0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
207c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
207d0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
207e0 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e     /* The pNC->n
207f0 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61  Depth==0 test ca
20800 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
20810 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71  unctions in subq
20820 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20  ueries.      ** 
20830 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f  to be ignored */
20840 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
20850 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20  nDepth==0 ){.   
20860 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
20870 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
20880 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
20890 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
208a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
208b0 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
208c0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
208d0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
208e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
208f0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
20900 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
20910 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
20920 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
20930 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
20940 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
20950 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
20960 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
20970 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
20980 70 72 2c 20 70 45 78 70 72 29 3d 3d 30 20 29 7b  pr, pExpr)==0 ){
20990 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
209a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
209b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
209c0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
209d0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
209e0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
209f0 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
20a00 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
20a10 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
20a20 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
20a30 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
20a40 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
20a50 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
20a60 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
20a70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
20a80 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
20a90 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
20aa0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
20ab0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20ac0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
20ad0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
20ae0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
20af0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
20b00 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
20b10 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
20b20 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
20b30 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
20b40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
20b50 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
20b60 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20b70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
20b80 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
20b90 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
20ba0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
20bb0 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
20bc0 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
20bd0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20be0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74  >u.zToken, sqlit
20bf0 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
20c00 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20  ->u.zToken),.   
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f  pExpr->x.pList ?
20c30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
20c40 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
20c50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
20c60 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
20c70 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
20c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20c90 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
20ca0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
20cb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
20cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20cd0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
20ce0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
20cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20d00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20d10 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
20d20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
20d30 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
20d40 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
20d50 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
20d60 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
20d70 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
20d80 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20d90 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
20da0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
20db0 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
20dc0 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20  ble(pExpr);.    
20dd0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
20de0 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
20df0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
20e00 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
20e10 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
20e20 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
20e30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20e40 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
20e50 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
20e60 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
20e70 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
20e80 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
20e90 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d  *pSelect){.  Nam
20ea0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
20eb0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
20ec0 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
20ed0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d  h==0 ){.    pNC-
20ee0 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73  >nDepth++;.    s
20ef0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
20f00 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63  (pWalker, pSelec
20f10 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65  t);.    pNC->nDe
20f20 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  pth--;.    retur
20f30 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
20f40 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
20f50 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
20f60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c   }.}../*.** Anal
20f70 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
20f80 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
20f90 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
20fa0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
20fb0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
20fc0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
20fd0 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
20fe0 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
20ff0 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
21000 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
21010 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
21020 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
21030 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
21040 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
21050 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
21060 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
21070 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
21080 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
21090 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
210a0 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
210b0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
210c0 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
210d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
210e0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
210f0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
21100 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
21110 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
21120 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
21130 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
21140 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
21150 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
21160 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
21170 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
21180 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
21190 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
211a0 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
211b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
211c0 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
211d0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
211e0 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
211f0 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
21200 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
21210 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
21220 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
21230 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
21240 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
21250 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
21260 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
21270 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
21280 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
21290 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
212a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
212b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
212c0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
212d0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
212e0 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
212f0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
21300 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
21310 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
21320 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
21330 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
21340 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
21350 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
21360 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
21370 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
21380 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
21390 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
213a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
213b0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
213c0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
213d0 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
213e0 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
213f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
21400 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
21410 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
21420 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
21430 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
21440 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
21450 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
21460 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
21470 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
21480 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
21490 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
214a0 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
214b0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
214c0 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
214d0 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  dallocation is d
214e0 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
214f0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
21500 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
21510 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
21520 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
21530 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
21540 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
21550 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
21560 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
21570 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
21580 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
21590 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
215a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
215b0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
215c0 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
215d0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
215e0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
215f0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
21600 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
21610 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
21620 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
21630 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
21640 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
21650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
21660 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
21670 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
21680 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
21690 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
216a0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
216b0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
216c0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
216d0 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
216e0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
216f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
21700 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
21710 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
21720 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
21730 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
21740 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
21750 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
21760 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
21770 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
21780 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
21790 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
217a0 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
217b0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
217c0 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
217d0 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
217e0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
217f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
21800 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
21810 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
21820 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21830 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
21840 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
21850 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74  t nReg){.  sqlit
21860 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
21870 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
21880 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
21890 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
218a0 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
218b0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
218c0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
218d0 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
218e0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
218f0 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
21900 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
21910 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
21920 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
21930 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
21940 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
21950 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21960 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
21970 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
21980 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
21990 0a                                               .