/ Hex Artifact Content
Login

Artifact bfed2f8ad9272aa1dd759dcae4310959b5b4c741:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
0c10: 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  op;.    pColl = 
0c20: 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  p->pColl;.    if
0c30: 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ( pColl ) break;
0c40: 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  .    op = p->op;
0c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
0c60: 21 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  !=0 && (.       
0c70: 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55   op==TK_AGG_COLU
0c80: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c  MN || op==TK_COL
0c90: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  UMN || op==TK_RE
0ca0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
0cb0: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 29 29 7b  _TRIGGER.    )){
0cc0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
0cd0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0ce0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0cf0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0d00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
0d10: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0d20: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0d30: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0d40: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0d50: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ster */.      co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
0d80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
0d90: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
0da0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
0db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0dc0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70         zColl = p
0dd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0de0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0df0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0e00: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0e10: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0e20: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
0e30: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
0e60: 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26  f( op!=TK_CAST &
0e70: 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29  & op!=TK_UPLUS )
0e80: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
0e90: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
0ea0: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
0eb0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0ec0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0ed0: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0ee0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0ef0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0f00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
0f10: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
0f20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0f30: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
0f40: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0f50: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
0f60: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
0f70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
0f80: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0f90: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0fa0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
0fb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0fc0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
0fd0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0fe0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
0ff0: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1000: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1010: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1020: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
1030: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
1040: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
1050: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
1060: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
1070: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1080: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1090: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
10a0: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
10b0: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
10c0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
10d0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
10e0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
10f0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1100: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1120: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
1130: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1160: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
1170: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1180: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1190: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11a0: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
11b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
11c0: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
11d0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
11e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
11f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1200: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1210: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
1220: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
1230: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
1240: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1250: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
1260: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
1270: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1290: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
12a0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
12b0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
12c0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
12d0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
12e0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
12f0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1300: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1310: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1320: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
1330: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
1340: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
1350: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1360: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
1370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1380: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1390: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
13a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
13b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
13c0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
13d0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
13e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
13f0: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1400: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1410: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1430: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
1440: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1450: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
1460: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
1470: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1480: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1490: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
14b0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
14c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
14f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1500: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1510: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
1520: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
1530: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
1540: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
1550: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
1560: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
1570: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1580: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1590: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
15a0: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
15b0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
15c0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
15d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
15e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
15f0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1600: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1610: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
1620: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
1630: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1640: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
1650: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
1660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1670: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1680: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1690: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
16a0: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
16b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
16c0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
16d0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
16e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1700: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1710: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
1720: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
1730: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1740: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
1750: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1760: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
1770: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1780: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a0: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
17b0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
17c0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
17d0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
17e0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
17f0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1800: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1810: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1820: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1830: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1840: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1850: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1860: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1870: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1880: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1890: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
18a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
18b0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
18c0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
18d0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1910: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1920: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1930: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1940: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1950: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1960: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1970: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1980: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1990: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19a0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
19b0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
19c0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
19d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
19e0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
19f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1a00: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1a10: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1a20: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1a30: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1a40: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1a50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1a60: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1a70: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1a80: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1a90: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1aa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1ab0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1ac0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ad0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1af0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1b00: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1b10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b20: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1b40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1b50: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b60: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1b70: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1b80: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1b90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ba0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1bb0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1bc0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1bd0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1be0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1c10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1c20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1c30: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1c40: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1c50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1c90: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1ca0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1cc0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1cd0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cf0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1d00: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1d10: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1d20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1d30: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d50: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1d80: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1d90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1da0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1db0: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
1dc0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1dd0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
1de0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1df0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e00: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
1e10: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1e20: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
1e30: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
1e40: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
1e50: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
1e60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
1e70: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
1e80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1e90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1ea0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1eb0: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
1ec0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
1ed0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
1ee0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
1f10: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
1f20: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
1f50: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
1f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f70: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
1f80: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
1f90: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1fa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1fb0: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1fc0: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fd0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fe0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1ff0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2010: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2020: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2030: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2040: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2060: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2080: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
20b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
20c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20e0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20f0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2100: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2110: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2120: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2130: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2140: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2150: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2180: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
21a0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
21b0: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
21c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21d0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21e0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2200: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2210: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2220: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2230: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2240: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2250: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2260: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2270: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2280: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2290: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22a0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
22b0: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
22c0: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22d0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22e0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22f0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2310: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2340: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2350: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2360: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2370: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2380: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2390: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
23a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
23c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2400: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2410: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2440: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2450: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2460: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24a0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
24b0: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
24c0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24d0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24e0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24f0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2500: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2510: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2520: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2530: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2540: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2550: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2560: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2570: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2580: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2590: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
25a0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
25b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
25c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25d0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2600: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2610: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2620: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2630: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2640: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2650: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2660: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2670: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2680: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2690: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
26a0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
26b0: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
26c0: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26d0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2700: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2710: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2720: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2730: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2740: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2760: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2770: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2780: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2790: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
27a0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
27b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
27c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27e0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27f0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2800: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2810: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2820: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2830: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2840: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2850: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2860: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2870: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2880: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2890: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
28a0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
28b0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
28c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28d0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28e0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28f0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2910: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2920: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2940: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2950: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2960: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2970: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2980: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2990: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
29a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
29c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2a10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2a20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a70: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a80: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a90: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2aa0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2ab0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2ac0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ad0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ae0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2af0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2b00: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2b10: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2b20: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ba0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2bb0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2bc0: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2bd0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2be0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bf0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2c00: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2c10: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2c20: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c30: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c40: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c50: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c60: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c70: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c80: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c90: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2ca0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2cb0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2cc0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2cd0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cf0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2d00: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2d10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2d20: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d30: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d40: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d50: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d60: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d70: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d80: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d90: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2da0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2db0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2dc0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2dd0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2de0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2df0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2e00: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2e10: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2e20: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e30: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e40: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e50: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e60: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e80: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ea0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2eb0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ee0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ef0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2f00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2f10: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2f20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f30: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f50: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f60: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f70: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f80: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2fa0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2fb0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2fc0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fd0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fe0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2ff0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3000: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3010: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3020: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3060: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3070: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3080: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3090: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
30a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
30b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
30d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
30e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
30f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3100: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3110: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3130: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3140: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3150: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3160: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3170: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3180: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3190: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31a0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
31b0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
31c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
31d0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31e0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31f0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3200: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3210: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3220: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3230: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3240: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3250: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3260: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3280: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3290: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
32a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
32b0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
32c0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
32d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32e0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32f0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3300: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3310: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3330: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3340: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3350: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3360: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3370: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3380: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3390: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
33a0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
33b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
33d0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33f0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3400: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3420: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3440: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3450: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3460: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3470: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3480: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3490: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
34a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34b0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
34c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
34d0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34e0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34f0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3500: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3510: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3520: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3530: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3540: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3550: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3560: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3570: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3580: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3590: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
35a0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
35b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
35c0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
35d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35e0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3600: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3610: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3640: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3650: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3670: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3680: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3690: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
36a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
36b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
36c0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
36d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36e0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36f0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3700: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3730: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3750: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3760: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3780: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3790: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
37a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
37b0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
37c0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
37d0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37e0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37f0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3800: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3820: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3830: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3840: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3850: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3860: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3870: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3880: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3890: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
38a0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
38b0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
38c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
38d0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38e0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38f0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3900: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3910: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3920: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3940: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3950: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3960: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3970: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3980: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3990: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
39a0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
39b0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
39c0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
39d0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39e0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39f0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3a00: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3a10: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3a20: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3a30: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3a40: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3a50: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3a60: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3a70: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3a80: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3a90: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3aa0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ab0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ae0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3af0: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3b00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3b10: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3b20: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3b30: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3b40: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3b50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3b60: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3b70: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3b80: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3b90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
3ba0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
3bb0: 6d 75 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e  must be FALSE in
3bc0: 20 61 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30   all cases and 0
3bd0: 20 69 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   if the.** expre
3be0: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74  ssion might be t
3bf0: 72 75 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rue.  This is an
3c00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
3c10: 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72  If is OK to.** r
3c20: 65 74 75 72 6e 20 30 20 68 65 72 65 20 65 76 65  eturn 0 here eve
3c30: 6e 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  n if the express
3c40: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
3c50: 77 61 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a  ways false (a .*
3c60: 2a 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  * false negative
3c70: 29 2e 20 20 42 75 74 20 69 74 20 69 73 20 61 20  ).  But it is a 
3c80: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
3c90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
3ca0: 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72  n.** might be tr
3cb0: 75 65 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20  ue in some rare 
3cc0: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61  circumstances (a
3cd0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
3ce0: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ).**.** Note tha
3cf0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
3d00: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63  ion is part of c
3d10: 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61  onditional for a
3d20: 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  .** LEFT JOIN, t
3d30: 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  hen we cannot de
3d40: 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69  termine at compi
3d50: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
3d60: 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20  or not.** is it 
3d70: 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73  true or false, s
3d80: 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  o always return 
3d90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3da0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
3db0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
3dc0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
3dd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3de0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
3df0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
3e00: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
3e10: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
3e20: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
3e30: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
3e40: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3e50: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3e60: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3e70: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3e80: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3e90: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3ea0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3eb0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
3ec0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
3ed0: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
3ee0: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
3ef0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
3f00: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
3f10: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
3f20: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
3f30: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
3f40: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
3f50: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
3f60: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3f70: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
3f80: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
3f90: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
3fa0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
3fb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3fc0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
3fd0: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
3fe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
3ff0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
4000: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
4010: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
4020: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
4030: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4040: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
4050: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
4060: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4070: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
4080: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
4090: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
40a0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
40b0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
40c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
40d0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
40e0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
40f0: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
4100: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
4110: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
4120: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
4130: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
4140: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
4150: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
4160: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
4170: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
4180: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
4190: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
41a0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
41b0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
41c0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
41d0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
41e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
41f0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
4200: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4210: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4220: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
4230: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4240: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
4250: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
4260: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
4270: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4280: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4290: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
42a0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
42b0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
42c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
42d0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
42e0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
42f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4300: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
4310: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
4320: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
4330: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
4340: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4350: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4360: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4370: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4380: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4390: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
43a0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
43b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
43c0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
43d0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
43e0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
43f0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4400: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4410: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4420: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4430: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4440: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4450: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4460: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4470: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4480: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4490: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
44a0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
44b0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
44c0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
44d0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
44e0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
44f0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4500: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4510: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4520: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4530: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4540: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4550: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4560: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
4570: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
4580: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
4590: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
45a0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
45b0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
45c0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
45d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
45e0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
45f0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
4600: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4610: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
4620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4640: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4660: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
4670: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4680: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
4690: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
46a0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
46b0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
46c0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
46d0: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
46e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
46f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
4700: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4710: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4720: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4730: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4740: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4750: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4760: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
4770: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
4780: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4790: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
47a0: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
47b0: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
47c0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
47d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
47e0: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
47f0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
4800: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
4810: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
4820: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
4830: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
4840: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
4850: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
4860: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
4870: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
4880: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
4890: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
48a0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
48b0: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
48c0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
48d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
48e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
48f0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4900: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4910: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
4920: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
4930: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
4940: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
4950: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
4960: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
4970: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
4980: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
4990: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
49a0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
49b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
49c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
49d0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
49e0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
49f0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
4a00: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
4a10: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4a20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
4a30: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
4a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4a50: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
4a60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
4a70: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
4a80: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
4a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
4aa0: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
4ab0: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
4ac0: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
4ad0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4ae0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
4af0: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
4b00: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
4b10: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
4b20: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
4b30: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
4b40: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
4b50: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
4b60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
4b70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
4b80: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
4b90: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
4ba0: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
4bb0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
4bc0: 61 7a 56 61 72 5b 69 5d 20 26 26 20 6d 65 6d 63  azVar[i] && memc
4bd0: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
4be0: 5b 69 5d 2c 7a 2c 6e 2b 31 29 3d 3d 30 20 29 7b  [i],z,n+1)==0 ){
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
4c00: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
4c10: 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20  (ynVar)i+1;.    
4c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4c40: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20       if( x==0 ) 
4c50: 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  x = pExpr->iColu
4c60: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4c70: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4c80: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20    }.    if( x>0 
4c90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  ){.      if( x>p
4ca0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a  Parse->nzVar ){.
4cb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
4cc0: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71  ;.        a = sq
4cd0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
4ce0: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4cf0: 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  , x*sizeof(a[0])
4d00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
4d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
4d20: 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64  * Error reported
4d30: 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c   through db->mal
4d40: 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20  locFailed */.   
4d50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
4d60: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
4d70: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
4d80: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
4d90: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
4da0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
4db0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
4dc0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
4dd0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
4de0: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
4df0: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
4e00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4e10: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
4e20: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
4e30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4e40: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
4e50: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4e60: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
4e70: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
4e80: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
4e90: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
4ea0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4eb0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4ec0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4ed0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4ee0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
4ef0: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
4f00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4f10: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4f20: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
4f30: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
4f40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4f50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4f60: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
4f70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  =0 ) return;.  /
4f80: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
4f90: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
4fa0: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
4fb0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
4fc0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
4fd0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4fe0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
4ff0: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
5000: 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ue>=0 );.  if( !
5010: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
5020: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
5030: 6c 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ly) ){.    sqlit
5040: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5050: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
5060: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5070: 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  e(db, p->pRight)
5080: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
5090: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
50a0: 5f 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d  _Reduced) && (p-
50b0: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61  >flags2 & EP2_Ma
50c0: 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20  llocedToken)!=0 
50d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
50f0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  zToken);.    }. 
5100: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5110: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5120: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
5130: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5140: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
5150: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
5160: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5170: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5180: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
5190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
51a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
51b0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
51c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
51d0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
51e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
51f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5200: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
5210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
5220: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
5230: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5240: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
5250: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5260: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5270: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5280: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5290: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
52b0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
52c0: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
52d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
52e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
52f0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
5300: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
5310: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5320: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
5330: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
5340: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
5350: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5360: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5370: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5380: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5390: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
53a0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
53b0: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
53c0: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
53d0: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
53e0: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
53f0: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
5400: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
5410: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
5420: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5430: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
5440: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
5450: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5460: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5470: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5480: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5490: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
54a0: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
54b0: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
54c0: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
54d0: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
54e0: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
54f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5530: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
5540: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5550: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
5560: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
5570: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
5580: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
5590: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
55a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
55b0: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
55c0: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
55d0: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
55e0: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
55f0: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
5600: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
5610: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
5620: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
5630: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
5640: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
5650: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
5660: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
5670: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
5680: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5690: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
56a0: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
56b0: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
56c0: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
56d0: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
56e0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
56f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
5700: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
5710: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
5720: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
5730: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
5740: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
5750: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
5760: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
5770: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
5780: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
5790: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
57a0: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
57b0: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
57c0: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
57d0: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
57e0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
57f0: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
5800: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
5810: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
5820: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
5830: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
5840: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
5850: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
5860: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
5870: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5880: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
5890: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
58a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
58b0: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
58c0: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
58d0: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
58e0: 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52  make a EXPRDUP_R
58f0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
5900: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
5910: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
5920: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
5930: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
5940: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
5950: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
5960: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
5970: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
5980: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
5990: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
59a0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
59b0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
59c0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
59d0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
59e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
59f0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5a00: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5a10: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
5a20: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
5a30: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
5a40: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
5a50: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
5a60: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
5a70: 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66  d */.  if( 0==(f
5a80: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5a90: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
5aa0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
5ab0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
5ac0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5ad0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
5ae0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
5af0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
5b00: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
5b10: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
5b20: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
5b30: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
5b40: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
5b50: 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20  dToken)==0 );.  
5b60: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c    assert( (p->fl
5b70: 61 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64  ags2 & EP2_Irred
5b80: 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  ucible)==0 );.  
5b90: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
5ba0: 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70  | p->pRight || p
5bb0: 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e  ->pColl || p->x.
5bc0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
5bd0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
5be0: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
5bf0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
5c00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
5c10: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5c20: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
5c30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5c40: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
5c50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5c60: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
5c70: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
5c80: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
5c90: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
5ca0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5cb0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
5cc0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
5cd0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
5ce0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
5cf0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
5d00: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5d10: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
5d20: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5d30: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
5d40: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5d50: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
5d60: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
5d70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5d80: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
5d90: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
5da0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
5db0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
5dc0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
5dd0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
5de0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
5df0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5e00: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5e10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
5e20: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
5e30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5e40: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5e50: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
5e60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5e70: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
5e80: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
5e90: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
5ea0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5eb0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
5ec0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
5ed0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5ee0: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
5ef0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
5f00: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
5f10: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
5f20: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
5f30: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
5f40: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
5f50: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
5f60: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
5f70: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
5f80: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
5f90: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
5fa0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
5fb0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
5fc0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
5fd0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
5fe0: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
5ff0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
6000: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
6010: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
6020: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
6030: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
6040: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6050: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
6060: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6070: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
6080: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6090: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
60a0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
60b0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
60c0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
60d0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
60e0: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
60f0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
6100: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
6110: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
6120: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
6130: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
6140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6150: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
6160: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
6170: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
6180: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
6190: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
61a0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
61b0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
61c0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
61d0: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
61e0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
61f0: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
6200: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
6210: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
6220: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
6230: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
6240: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
6250: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6260: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6270: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6280: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6290: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
62a0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
62b0: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
62c0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
62d0: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
62e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
62f0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
6300: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
6310: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
6320: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
6330: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
6340: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6360: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6370: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6380: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6390: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
63a0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
63b0: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
63c0: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
63d0: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
63e0: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
63f0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
6400: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
6410: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
6420: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
6430: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
6440: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6450: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6460: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6470: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6480: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6490: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
64a0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
64b0: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
64c0: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
64d0: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
64e0: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
64f0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6500: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6510: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6520: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6530: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6540: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6550: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6560: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6570: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6580: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6590: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
65a0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
65b0: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
65c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
65d0: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
65e0: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
65f0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6600: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6610: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6620: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6630: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6640: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6650: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6660: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6670: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6680: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6690: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
66a0: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
66b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
66c0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
66d0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
66e0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
66f0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6700: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6710: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6720: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6740: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6750: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6760: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6770: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6780: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6790: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
67a0: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
67b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
67c0: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
67d0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
67f0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6800: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6810: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6820: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6830: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6840: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6850: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6860: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6870: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6880: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6890: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
68a0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
68b0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
68c0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29  nOnly|EP_Static)
68d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
68e0: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
68f0: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
6900: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
6910: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
6920: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
6930: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
6940: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
6950: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
6960: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
6970: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
6980: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
6990: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
69a0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
69b0: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
69c0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
69d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
69e0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
69f0: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
6a00: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
6a10: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
6a20: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
6a30: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
6a40: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
6a50: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
6a60: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
6a70: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6a80: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6a90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
6aa0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
6ab0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6ac0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
6ad0: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
6ae0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
6af0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
6b00: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
6b10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6b20: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
6b30: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
6b40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
6b50: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6b60: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
6b70: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
6b80: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
6b90: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6ba0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
6bb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6bc0: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
6bd0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
6be0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6bf0: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
6c00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
6c10: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
6c20: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6c30: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
6c40: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
6c50: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6c60: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6c70: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6c80: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
6c90: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
6ca0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
6cb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6cc0: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
6cd0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
6ce0: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
6cf0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d10: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d    pNew->flags2 =
6d20: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6d30: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
6d40: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
6d50: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6d60: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6d70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6d80: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
6d90: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6da0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
6db0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
6dc0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
6dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6df0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
6e10: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
6e20: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
6e30: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
6e40: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
6e50: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
6e60: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
6e70: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
6e80: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
6e90: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
6ea0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
6eb0: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
6ec0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
6ed0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
6ee0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
6ef0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
6f00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
6f10: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
6f20: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
6f30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6f40: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
6f50: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
6f60: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
6f70: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
6f80: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
6f90: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
6fa0: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
6fb0: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
6fc0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
6fd0: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
6fe0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
6ff0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
7000: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
7010: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
7020: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
7030: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
7040: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
7050: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
7060: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
7070: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
7080: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
7090: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
70a0: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
70b0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
70c0: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
70d0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
70e0: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
70f0: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
7100: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
7110: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7120: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
7130: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
7140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7150: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
7160: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44  {.  return exprD
7170: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
7180: 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20   0);.}.ExprList 
7190: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
71a0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
71b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
71c0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
71d0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
71e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
71f0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
7200: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
7210: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7220: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7230: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7240: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
7250: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
7260: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7270: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
7280: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
7290: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
72a0: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
72b0: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
72c0: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
72d0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
72e0: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
72f0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
7300: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7310: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
7320: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
7330: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
7340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7350: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7360: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
7370: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
7380: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
7390: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
73a0: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
73b0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
73c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
73d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
73e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
73f0: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
7400: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
7410: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
7420: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7430: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7440: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
7450: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
7460: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7470: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
7480: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
7490: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
74a0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
74b0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
74c0: 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72     pItem->iOrder
74d0: 42 79 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d  ByCol = pOldItem
74e0: 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20  ->iOrderByCol;. 
74f0: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
7500: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
7510: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
7520: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7530: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
7540: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
7550: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
7560: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
7570: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
7580: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
7590: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
75a0: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
75b0: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
75c0: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
75d0: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
75e0: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
75f0: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
7600: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
7610: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
7620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7630: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7640: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7650: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
7660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7670: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
7680: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
7690: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
76a0: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
76b0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
76c0: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
76d0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
76e0: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
76f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
7700: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
7710: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
7720: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
7730: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
7740: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
7750: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7760: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
7770: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7780: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7790: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
77a0: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
77b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
77c0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
77d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
77e0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
77f0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
7800: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7810: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
7820: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
7830: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
7840: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
7850: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7860: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7870: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
7880: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
7890: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
78a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
78b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
78c0: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
78d0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
78e0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
78f0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
7900: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
7910: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
7920: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
7930: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
7940: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
7950: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
7960: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
7970: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
7980: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
7990: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
79a0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
79b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
79c0: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 70  isCorrelated = p
79d0: 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  OldItem->isCorre
79e0: 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  lated;.    pNewI
79f0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
7a00: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7a10: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64  , pOldItem->zInd
7a20: 65 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ex);.    pNewIte
7a30: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
7a40: 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pOldItem->notInd
7a50: 65 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74  exed;.    pNewIt
7a60: 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c  em->pIndex = pOl
7a70: 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20  dItem->pIndex;. 
7a80: 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74     pTab = pNewIt
7a90: 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49  em->pTab = pOldI
7aa0: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
7ab0: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
7ac0: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
7ad0: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
7ae0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
7af0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7b00: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
7b10: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
7b20: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
7b30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7b40: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
7b50: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
7b60: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
7b70: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
7b80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7b90: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
7ba0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
7bb0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
7bc0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
7bd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
7be0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
7bf0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7c00: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
7c10: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
7c20: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
7c30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7c40: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
7c50: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
7c60: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
7c70: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7c80: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7c90: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
7ca0: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
7cb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
7cc0: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
7cd0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
7ce0: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
7cf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7d00: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
7d10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
7d20: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
7d30: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
7d40: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
7d50: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
7d60: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
7d70: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
7d80: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
7d90: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
7da0: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
7db0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
7dc0: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
7dd0: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
7de0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
7df0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
7e00: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
7e10: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
7e20: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
7e30: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
7e40: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
7e50: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
7e60: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
7e70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7e80: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
7e90: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
7ea0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
7eb0: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
7ec0: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
7ed0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
7ee0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7ef0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
7f00: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
7f10: 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pNew, *pPrior;. 
7f20: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7f30: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7f40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7f50: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  w(db, sizeof(*p)
7f60: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7f70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f80: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
7f90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
7fa0: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
7fb0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7fc0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
7fd0: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
7fe0: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
7ff0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
8000: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8010: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
8020: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
8030: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
8040: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8050: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
8060: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
8070: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
8080: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
8090: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
80a0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
80b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
80c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
80d0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
80e0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
80f0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
8100: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
8110: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
8120: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
8130: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
8140: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
8150: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
8160: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
8170: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
8180: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8190: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
81a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
81b0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
81c0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
81d0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
81e0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
81f0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
8200: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
8210: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
8220: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
8230: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
8240: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
8250: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
8260: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
8270: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
8280: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
8290: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
82a0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
82b0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
82c0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
82d0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
82e0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
82f0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
8300: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
8310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
8320: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
8330: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
8340: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
8350: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8360: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
8370: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
8380: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
8390: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
83a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
83b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
83c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
83d0: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
83e0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
83f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
8400: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
8410: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
8420: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
8430: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
8440: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
8450: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
8460: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
8470: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
8480: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
8490: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
84a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
84b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
84c0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
84d0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
84e0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
84f0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
8500: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
8510: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
8520: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
8530: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
8540: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
8550: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8560: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
8570: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
8580: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8590: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
85a0: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
85b0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
85c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
85d0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
85e0: 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
85f0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8600: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
8610: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
8620: 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f  pList->a==0 ) go
8630: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c  to no_mem;.  }el
8640: 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  se if( (pList->n
8650: 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e  Expr & (pList->n
8660: 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  Expr-1))==0 ){. 
8670: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8680: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
8690: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
86a0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 20  Expr>0 );.    a 
86b0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
86c0: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c  oc(db, pList->a,
86d0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a   pList->nExpr*2*
86e0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
86f0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
8700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
8710: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
8720: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
8730: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8740: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
8750: 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74 72  if( 1 ){.    str
8760: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8770: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
8780: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
8790: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
87a0: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
87b0: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
87c0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
87d0: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Expr;.  }.  retu
87e0: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
87f0: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
8800: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
8810: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
8820: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
8830: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8840: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
8850: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8860: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
8870: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8880: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
8890: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
88a0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
88b0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
88c0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
88d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
88e0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
88f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
8900: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
8910: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
8920: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
8930: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
8940: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
8950: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
8960: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8970: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
8980: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
8990: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
89a0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
89b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
89c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
89d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
89e0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
89f0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
8a00: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
8a10: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
8a20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
8a30: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
8a40: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
8a50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
8a60: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
8a70: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
8a80: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
8a90: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
8aa0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
8ab0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
8ac0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
8ad0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8ae0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8af0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
8b00: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
8b10: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
8b20: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
8b30: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
8b40: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
8b50: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
8b60: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
8b70: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
8b80: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
8b90: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
8ba0: 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 70 49  f( dequote && pI
8bb0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c  tem->zName ) sql
8bc0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
8bd0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
8be0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8bf0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
8c00: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
8c10: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8c20: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
8c30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8c40: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
8c50: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
8c60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
8c70: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
8c80: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
8c90: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
8ca0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8cb0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
8cc0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8cd0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
8ce0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
8cf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
8d00: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
8d10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8d20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8d30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8d40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
8d50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
8d60: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
8d70: 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61  an. */.  ExprSpa
8d80: 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20  n *pSpan        
8d90: 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20   /* The span to 
8da0: 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20  be added */.){. 
8db0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8dc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
8dd0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
8de0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8df0: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
8e00: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
8e10: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8e20: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
8e30: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
8e40: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
8e50: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
8e60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
8e70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
8e80: 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d  | pItem->pExpr==
8e90: 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a  pSpan->pExpr );.
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8eb0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
8ec0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
8ed0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
8ee0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
8ef0: 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72  ar*)pSpan->zStar
8f00: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70         (int)(pSp
8f30: 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e  an->zEnd - pSpan
8f40: 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a  ->zStart));.  }.
8f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
8f60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
8f70: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
8f80: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
8f90: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
8fa0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8fb0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
8fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
8fd0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
8fe0: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
8ff0: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
9000: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
9010: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
9020: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
9030: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
9040: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
9050: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
9060: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
9070: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
9080: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
9090: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
90a0: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
90b0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
90c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
90d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
90e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
90f0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
9100: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
9110: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9120: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
9130: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
9140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9150: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
9160: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
9170: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
9180: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
9190: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
91a0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
91b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
91c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
91d0: 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e  a!=0 || pList->n
91e0: 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  Expr==0 );.  for
91f0: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
9200: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
9210: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
9220: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
9230: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9240: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
9250: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9260: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
9270: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9280: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
9290: 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  zSpan);.  }.  sq
92a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
92b0: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
92c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
92d0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
92e0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
92f0: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
9300: 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70  cks.  Walker.u.p
9310: 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  i is a pointer.*
9320: 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  * to an integer.
9330: 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
9340: 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e   are checking an
9350: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
9360: 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61  ee.** if it is a
9370: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20   constant.  Set 
9380: 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20  *Walker.u.pi to 
9390: 30 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  0 if the express
93a0: 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f  ion is.** not co
93b0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
93c0: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
93d0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
93e0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
93f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
9400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9410: 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20  IsConstant().** 
9420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9430: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
9440: 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  ().**     sqlite
9450: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
9460: 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a  rFunction().**.*
9470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
9480: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
9490: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
94a0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
94b0: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
94c0: 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61  >u.i is 3 then a
94d0: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
94e0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
94f0: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
9500: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9510: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9520: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
9530: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
9540: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
9550: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
9560: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
9570: 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78  er->u.i==3 && Ex
9580: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
9590: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
95a0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
95b0: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
95c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
95d0: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
95e0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
95f0: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
9600: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
9610: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
9620: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
9630: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
9640: 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d   ** and pWalker-
9650: 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  >u.i==2 */.    c
9660: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
9670: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
9680: 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74  er->u.i==2 ) ret
9690: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 0;.      /* 
96a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
96b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
96c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
96d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
96e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
96f0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
9700: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
9710: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9720: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
9730: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9740: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
9750: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9760: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9770: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
9780: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
97a0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
97b0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
97c0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
97d0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
97e0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
97f0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9800: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
9810: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
9820: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
9830: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
9840: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9850: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
9860: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
9870: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
9880: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
9890: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
98a0: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
98b0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64  ic int selectNod
98c0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
98d0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
98e0: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
98f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9900: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
9910: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
9920: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
9930: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
9940: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
9950: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
9960: 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ag){.  Walker w;
9970: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
9980: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
9990: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
99a0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
99b0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
99c0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
99d0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
99e0: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
99f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
9a00: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
9a10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9a20: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9a30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9a40: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9a50: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9a60: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9a70: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9a80: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
9a90: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
9aa0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
9ab0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
9ac0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
9ad0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
9ae0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
9af0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
9b00: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
9b10: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9b20: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9b30: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9b40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9b50: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9b60: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9b70: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9b80: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9b90: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9ba0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9bb0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
9bc0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
9bd0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9be0: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9bf0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9c00: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9c10: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9c20: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
9c30: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
9c40: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
9c50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9c60: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
9c70: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
9c80: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9c90: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
9ca0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9cb0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9cc0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9cd0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9ce0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
9cf0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
9d00: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
9d10: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
9d20: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
9d30: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
9d40: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
9d50: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
9d60: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
9d70: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9d80: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
9d90: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
9da0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
9db0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
9dc0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
9dd0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
9de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9df0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9e00: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
9e10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
9e20: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
9e30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
9e40: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
9e50: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
9e60: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
9e70: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
9e80: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
9e90: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9ea0: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
9eb0: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
9ec0: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
9ed0: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
9ee0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
9ef0: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
9f00: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
9f10: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
9f20: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9f30: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
9f40: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
9f50: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
9f60: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9f70: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
9f80: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
9f90: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
9fa0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
9fb0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
9fc0: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
9fd0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
9fe0: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
9ff0: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
a000: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
a010: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a020: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
a030: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
a040: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
a050: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
a060: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
a070: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
a080: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
a090: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
a0a0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
a0b0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
a0c0: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
a0d0: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
a0e0: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
a0f0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a100: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
a110: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a120: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
a130: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
a140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a150: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a160: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
a170: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
a180: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
a190: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
a1a0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
a1b0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
a1c0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
a1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a1e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
a1f0: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
a200: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a210: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
a220: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
a230: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
a240: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
a250: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
a260: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a270: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
a280: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
a290: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
a2a0: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
a2b0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
a2c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a2d0: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
a2e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
a2f0: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
a300: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
a310: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
a320: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
a330: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
a340: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
a350: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
a360: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
a370: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
a380: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
a390: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
a3a0: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
a3b0: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
a3c0: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
a3d0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
a3e0: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
a3f0: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
a400: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
a410: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
a420: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
a430: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
a440: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
a450: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
a460: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
a470: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
a480: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
a490: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
a4a0: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
a4b0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
a4c0: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
a4d0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
a4e0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
a4f0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
a500: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
a510: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
a520: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
a530: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
a540: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
a550: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
a560: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
a570: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
a580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a590: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
a5a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
a5b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a5c0: 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e   an OP_IsNull in
a5d0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 74  struction that t
a5e0: 65 73 74 73 20 72 65 67 69 73 74 65 72 20 69 52  ests register iR
a5f0: 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20  eg and jumps.** 
a600: 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73  to location iDes
a610: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
a620: 6e 20 69 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20  n iReg is NULL. 
a630: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52   The value in iR
a640: 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75  eg .** was compu
a650: 74 65 64 20 62 79 20 70 45 78 70 72 2e 20 20 49  ted by pExpr.  I
a660: 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74  f we can look at
a670: 20 70 45 78 70 72 20 61 74 20 63 6f 6d 70 69 6c   pExpr at compil
a680: 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65  e-time and.** de
a690: 74 65 72 6d 69 6e 65 20 74 68 61 74 20 69 74 20  termine that it 
a6a0: 63 61 6e 20 6e 65 76 65 72 20 67 65 6e 65 72 61  can never genera
a6b0: 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  te a NULL, then 
a6c0: 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  the OP_IsNull op
a6d0: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
a6e0: 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  e omitted..*/.vo
a6f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
a700: 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20  deIsNullJump(.  
a710: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
a720: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
a730: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a740: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78  on */.  const Ex
a750: 70 72 20 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f  pr *pExpr,  /* O
a760: 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 4f 50 5f  nly generate OP_
a770: 49 73 4e 75 6c 6c 20 69 66 20 74 68 69 73 20 65  IsNull if this e
a780: 78 70 72 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  xpr can be NULL 
a790: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
a7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 73 74           /* Test
a7b0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a7c0: 69 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  is register for 
a7d0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44  NULL */.  int iD
a7e0: 65 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  est           /*
a7f0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
a800: 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20  e value is null 
a810: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  */.){.  if( sqli
a820: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
a830: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
a840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a850: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
a860: 52 65 67 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d  Reg, iDest);.  }
a870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a880: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
a890: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
a8a0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
a8b0: 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
a8c0: 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
a8d0: 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
a8e0: 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
a8f0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
a900: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
a910: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a920: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
a930: 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
a940: 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
a950: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
a960: 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
a970: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
a980: 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
a990: 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
a9a0: 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
a9b0: 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
a9c0: 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
a9d0: 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
a9e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a9f0: 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
aa00: 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
aa10: 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
aa20: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
aa30: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
aa40: 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 31  _NONE ) return 1
aa50: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
aa60: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
aa70: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
aa80: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
aa90: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
aaa0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
aab0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
aac0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
aad0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
aae0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
aaf0: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
ab00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
ab10: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ab20: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
ab30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
ab40: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
ab50: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
ab60: 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
ab70: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
ab80: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
ab90: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
aba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
abb0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
abc0: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
abd0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
abe0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
abf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ac00: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
ac10: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
ac20: 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
ac30: 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
ac40: 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
ac50: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
ac60: 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
ac70: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
ac80: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
ac90: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
aca0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
acb0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
acc0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
acd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
ace0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
acf0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
ad00: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
ad10: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
ad20: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
ad30: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
ad40: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
ad50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ad60: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
ad70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
ad80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ad90: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
ada0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
adb0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
adc0: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
add0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
ade0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
adf0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
ae00: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68  e are able to th
ae10: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70  e IN operator op
ae20: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a  timization on a.
ae30: 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  ** query of the 
ae40: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
ae50: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
ae60: 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74  .).**.** Where t
ae70: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61  he SELECT... cla
ae80: 75 73 65 20 69 73 20 61 73 20 73 70 65 63 69 66  use is as specif
ae90: 69 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d  ied by the param
aea0: 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20  eter to this.** 
aeb0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
aec0: 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
aed0: 20 70 61 73 73 65 64 20 69 6e 20 68 61 73 20 61   passed in has a
aee0: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
aef0: 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a  rocessed and no.
af00: 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20 62  ** errors have b
af10: 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69  een found..*/.#i
af20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af30: 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
af40: 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74  c int isCandidat
af50: 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74  eForInOpt(Select
af60: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
af70: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
af80: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
af90: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
afa0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64     /* right-hand
afd0: 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53   side of IN is S
afe0: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
aff0: 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
b000: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
b010: 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f    /* Not a compo
b020: 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
b030: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
b040: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
b050: 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
b060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b070: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b080: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b090: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
b0a0: 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73  tinct );.    tes
b0b0: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
b0c0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
b0d0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
b0e0: 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
b0f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
b100: 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
b110: 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61  keyword and no a
b120: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
b130: 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  ns */.  }.  asse
b140: 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
b150: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b160: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
b170: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
b180: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
b190: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b1b0: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
b1c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
b1d0: 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b1f0: 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f  o LIMIT means no
b200: 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28   OFFSET */.  if(
b210: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
b220: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b230: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
b240: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
b250: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
b260: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
b270: 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
b280: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
b290: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
b2a0: 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
b2b0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
b2c0: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
b2d0: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
b2e0: 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
b2f0: 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
b300: 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
b310: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
b320: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56  .pTab;.  if( NEV
b330: 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65  ER(pTab==0) ) re
b340: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
b350: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
b360: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b370: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
b380: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
b390: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
b3a0: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
b3b0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
b3c0: 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
b3d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
b3e0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
b3f0: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
b400: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
b410: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f  eturn 0;       /
b420: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  * One column in 
b430: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b440: 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  /.  if( pEList->
b450: 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
b460: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
b470: 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20  rn 0; /* Result 
b480: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  is a column */. 
b490: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
b4a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b4b0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
b4c0: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
b4d0: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
b4e0: 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73  n and allocate s
b4f0: 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61  pace for its fla
b500: 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a  g. Return the .*
b510: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
b520: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
b530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b540: 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a  CodeOnce(Parse *
b550: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
b560: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b570: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
b580: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
b590: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
b5a0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
b5b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b5c0: 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73  , OP_Once, pPars
b5d0: 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a  e->nOnce++);.}..
b5e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b5f0: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
b600: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
b610: 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
b620: 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54  ) operator..** T
b630: 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20  he pX parameter 
b640: 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  is the expressio
b650: 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  n on the RHS of 
b660: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
b670: 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
b680: 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74  be either a list
b690: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
b6a0: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a  or a subquery..*
b6b0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
b6c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b6d0: 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
b6e0: 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  e a b-tree objec
b6f0: 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  t that can.** be
b700: 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20   used either to 
b710: 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
b720: 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73  hip in the RHS s
b730: 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
b740: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
b750: 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52  members of the R
b760: 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67  HS set, skipping
b770: 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
b780: 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f  ** A cursor is o
b790: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
b7a0: 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
b7b0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
b7c0: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
b7d0: 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
b7e0: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
b7f0: 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
b800: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
b810: 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
b820: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
b830: 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
b840: 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
b850: 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
b860: 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63  EX_ROWID - The c
b870: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
b880: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
b890: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
b8a0: 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20  DEX_INDEX - The 
b8b0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
b8c0: 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
b8d0: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
b8e0: 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65  NDEX_EPH -   The
b8f0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
b900: 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
b910: 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
b940: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
b950: 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
b960: 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
b970: 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
b980: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
b990: 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
b9a0: 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
b9b0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b9c0: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
b9d0: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
b9e0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
b9f0: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
ba00: 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
ba10: 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
ba20: 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
ba30: 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
ba40: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
ba50: 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
ba60: 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
ba70: 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
ba80: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
ba90: 65 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65  ephermeral table
baa0: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
bab0: 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
bac0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
bad0: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
bae0: 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
baf0: 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
bb00: 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
bb10: 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
bb20: 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20  he set members, 
bb30: 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70  skipping any dup
bb40: 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73  licates. In this
bb50: 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65   case an.** ephe
bb60: 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
bb70: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
bb80: 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f  the selected <co
bb90: 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74  lumn> is guarant
bba0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
bbb0: 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
bbc0: 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
bbd0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bbe0: 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61  Y or it.** has a
bbf0: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
bc00: 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  nt or UNIQUE ind
bc10: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ex..**.** If the
bc20: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
bc30: 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
bc40: 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
bc50: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
bc60: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
bc70: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e 20  mbership tests. 
bc80: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 20  In this case an 
bc90: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
bca0: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
bcb0: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
bcc0: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
bcd0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
bce0: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
bcf0: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
bd00: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
bd10: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
bd20: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
bd30: 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
bd40: 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
bd50: 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
bd60: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
bd70: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
bd80: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
bd90: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
bda0: 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ains an SQL NULL
bdb0: 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72   .** value in or
bdc0: 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79  der to correctly
bdd0: 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
bde0: 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e  sions like "X IN
bdf0: 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20   (Y, Z)"..** If 
be00: 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
be10: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
be20: 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
be30: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
be40: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
be50: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
be60: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
be70: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
be80: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
be90: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20  *prNotFound. If 
bea0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
beb0: 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
bec0: 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
bed0: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
bee0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20   *prNotFound is 
bef0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
bf00: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
bf10: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
bf20: 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
bf30: 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e  n stored in *prN
bf40: 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a  otFound, then.**
bf50: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c   its initial val
bf60: 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  ue is NULL.  If 
bf70: 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20 6e  the (...) does n
bf80: 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61  ot remain consta
bf90: 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75  nt.** for the du
bfa0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75  ration of the qu
bfb0: 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45  ery (i.e. the SE
bfc0: 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68 65 20  LECT within the 
bfd0: 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63 6f  (...).** is a co
bfe0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
bff0: 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  y) then the valu
c000: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
c010: 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ed register is.*
c020: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
c030: 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 73 75  each time the su
c040: 62 71 75 65 72 79 20 69 73 20 72 65 72 75 6e 2e  bquery is rerun.
c050: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
c060: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75 73  .** caller to us
c070: 65 20 76 64 62 65 20 63 6f 64 65 20 65 71 75 69  e vdbe code equi
c080: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f  valent to the fo
c090: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
c0a0: 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e   if( register==N
c0b0: 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61  ULL ){.**     ha
c0c0: 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69  s_null = <test i
c0d0: 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  f data structure
c0e0: 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a   contains null>.
c0f0: 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72 20  **     register 
c100: 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  = 1.**   }.**.**
c110: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
c120: 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c  id running the <
c130: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
c140: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
c150: 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f  null>.** test mo
c160: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73  re often than is
c170: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23   necessary..*/.#
c180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c190: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
c1a0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
c1b0: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
c1c0: 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20  , Expr *pX, int 
c1d0: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20  *prNotFound){.  
c1e0: 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
c210: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
c220: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
c230: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
c260: 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
c270: 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
c280: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
c290: 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
c2a0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
c2b0: 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
c2c0: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
c2d0: 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e  que = (prNotFoun
c2e0: 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75 65  d==0);   /* True
c2f0: 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
c300: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
c310: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
c320: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
c330: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
c340: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
c350: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
c360: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
c370: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
c380: 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ee if an existin
c390: 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
c3a0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a   can be used to.
c3b0: 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65    ** satisfy the
c3c0: 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73   query.  This is
c3d0: 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67   preferable to g
c3e0: 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20  enerating a new 
c3f0: 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20  .  ** ephemeral 
c400: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20  table..  */.  p 
c410: 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72  = (ExprHasProper
c420: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
c430: 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65  ect) ? pX->x.pSe
c440: 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28  lect : 0);.  if(
c450: 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e   ALWAYS(pParse->
c460: 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61  nErr==0) && isCa
c470: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
c480: 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p) ){.    sqlite
c490: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c4a0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
c4b0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
c4c0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  nection */.    T
c4d0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c        /* Table <
c500: 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45  table>. */.    E
c510: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
c540: 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a  ion <column> */.
c550: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20      int iCol;   
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c580: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63  dex of column <c
c590: 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e  olumn> */.    in
c5a0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c5d0: 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f   idx for pTab */
c5e0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 20  ..    assert( p 
c5f0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
c600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
c610: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
c620: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
c630: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
c640: 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20  >pEList!=0 );   
c650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
c660: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
c670: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
c680: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
c690: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
c6a0: 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63  xpr!=0 ); /* Bec
c6b0: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
c6c0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
c6d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
c6e0: 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20  >pSrc!=0 );     
c6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
c700: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
c710: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
c720: 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e  /.    pTab = p->
c730: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
c740: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  .    pExpr = p->
c750: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
c760: 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70  pr;.    iCol = p
c770: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
c780: 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61    .    /* Code a
c790: 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  n OP_VerifyCooki
c7a0: 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  e and OP_TableLo
c7b0: 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
c7c0: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
c7d0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
c7e0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
c7f0: 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
c800: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
c810: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
c820: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
c830: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
c840: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
c850: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
c860: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
c870: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
c880: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
c890: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
c8a0: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
c8b0: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
c8c0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
c8d0: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
c8e0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
c8f0: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
c900: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
c910: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
c920: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
c930: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41   ){.      int iA
c940: 64 64 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64  ddr;..      iAdd
c950: 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
c960: 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  nce(pParse);..  
c970: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
c980: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
c990: 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
c9a0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
c9b0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
c9c0: 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
c9d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c9e0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
c9f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ca00: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
ca30: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20  r variable */.. 
ca40: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
ca50: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
ca60: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
ca70: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
ca80: 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
ca90: 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
caa0: 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
cab0: 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
cac0: 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
cad0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
cae0: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
caf0: 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ence.  */.      
cb00: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20  CollSeq *pReq = 
cb10: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
cb20: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
cb30: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
cb40: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Expr);..      /*
cb50: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
cb60: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
cb70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
cb80: 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20  rform the .     
cb90: 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
cba0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
cbb0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
cbc0: 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20  e column. If.   
cbd0: 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c     ** it is not,
cbe0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
cbf0: 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69  ble to use any i
cc00: 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndex..      */. 
cc10: 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
cc20: 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e  y_ok = sqlite3In
cc30: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
cc40: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
cc50: 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20  l].affinity);.. 
cc60: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
cc70: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
cc80: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
cc90: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
cca0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
ccb0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
ccc0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ccd0: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
cce0: 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  & sqlite3FindCol
ccf0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
cd00: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
cd10: 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20  ], 0)==pReq.    
cd20: 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65       && (!mustBe
cd30: 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d  Unique || (pIdx-
cd40: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
cd50: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
cd60: 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20  _None)).        
cd70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
cd80: 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20   iAddr;.        
cd90: 20 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20    char *pKey;.  
cda0: 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 20  .          pKey 
cdb0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
cdc0: 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
cdd0: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
cde0: 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73         iAddr = s
cdf0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
ce00: 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 20 20 20  Parse);.  .     
ce10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce20: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
ce30: 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
ce40: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
ce70: 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  y,P4_KEYINFO_HAN
ce80: 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20  DOFF);.         
ce90: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
cea0: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
ceb0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
cec0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
ced0: 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20  _INDEX;..       
cee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
cef0: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
cf00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cf10: 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70  prNotFound && !p
cf20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
cf30: 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  notNull ){.     
cf40: 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75         *prNotFou
cf50: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
cf60: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
cf70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cf80: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
cf90: 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a  , *prNotFound);.
cfa0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
cfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cfc0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
cfd0: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
cfe0: 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e  * Could not foun
cff0: 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
d000: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
d010: 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
d020: 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
d030: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
d040: 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
d050: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
d060: 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
d070: 20 20 20 20 64 6f 75 62 6c 65 20 73 61 76 65 64      double saved
d080: 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
d090: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
d0a0: 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
d0b0: 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
d0c0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
d0d0: 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e  EPH;.    if( prN
d0e0: 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20  otFound ){.     
d0f0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72   *prNotFound = r
d100: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
d110: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d130: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
d140: 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  , 0, *prNotFound
d150: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d160: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
d170: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
d180: 3e 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20  >(double)1 );.  
d190: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
d1a0: 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65  ryLoop = (double
d1b0: 29 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  )1;.      if( pX
d1c0: 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
d1d0: 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 41 6e  <0 && !ExprHasAn
d1e0: 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  yProperty(pX, EP
d1f0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
d200: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
d210: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
d220: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d230: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
d240: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
d250: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
d260: 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
d270: 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
d280: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
d290: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
d2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d2b0: 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
d2c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
d2d0: 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
d2e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d2f0: 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
d300: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
d310: 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
d320: 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
d330: 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
d340: 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
d350: 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
d360: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
d370: 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
d380: 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
d390: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
d3a0: 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
d3b0: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
d3c0: 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
d3d0: 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
d3e0: 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
d3f0: 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
d400: 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
d410: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
d420: 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
d430: 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
d440: 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
d450: 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
d460: 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
d470: 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
d480: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
d490: 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
d4a0: 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
d4b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
d4c0: 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
d4d0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
d4e0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
d4f0: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
d500: 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
d510: 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
d520: 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
d530: 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
d540: 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
d550: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
d560: 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
d570: 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
d580: 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
d590: 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
d5a0: 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
d5b0: 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
d5c0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
d5d0: 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
d5e0: 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
d5f0: 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
d600: 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
d610: 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
d620: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
d630: 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
d640: 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
d650: 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
d660: 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
d670: 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
d680: 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46  ains NULLs..** F
d690: 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20  urthermore, the 
d6a0: 49 4e 20 69 73 20 69 6e 20 61 20 57 48 45 52 45  IN is in a WHERE
d6b0: 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74   clause and that
d6c0: 20 77 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a   we really want.
d6d0: 2a 2a 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76  ** to iterate ov
d6e0: 65 72 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  er the RHS of th
d6f0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e  e IN operator in
d700: 20 6f 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c   order to quickl
d710: 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20  y locate.** all 
d720: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48  corresponding LH
d730: 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c  S elements.  All
d740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
d750: 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  es is initialize
d760: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
d770: 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
d780: 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20  veNull to NULL. 
d790: 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   Calling routine
d7a0: 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63  s will take.** c
d7b0: 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
d7c0: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 76 61  this register va
d7d0: 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20  lue to non-NULL 
d7e0: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
d7f0: 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  LL-free..**.** I
d800: 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
d810: 73 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  s zero, that mea
d820: 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62 71  ns that the subq
d830: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  uery is being us
d840: 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72  ed.** for member
d850: 73 68 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c  ship testing onl
d860: 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  y.  There is no 
d870: 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  need to initiali
d880: 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74  ze any.** regist
d890: 65 72 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ers to indicate 
d8a0: 74 68 65 20 70 72 65 73 65 6e 73 65 20 6f 72 20  the presense or 
d8b0: 61 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73  absence of NULLs
d8c0: 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a   on the RHS..**.
d8d0: 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
d8e0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
d8f0: 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
d900: 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
d910: 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
d920: 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74  .  For IN operat
d930: 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ors or if an err
d940: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72  or occurs, the r
d950: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30  eturn value is 0
d960: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
d970: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
d980: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
d990: 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
d9a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d9b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d9c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d9d0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
d9e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
d9f0: 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
da00: 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
da10: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
da20: 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  l,       /* Regi
da30: 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
da40: 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
da50: 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
da60: 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
da70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
da80: 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
da90: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
daa0: 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
dab0: 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b 20 20  testAddr = -1;  
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
dae0: 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
daf0: 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
db20: 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
db30: 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62  sulting */.  Vdb
db40: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
db50: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
db60: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
db70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
db80: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
db90: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ush(pParse);..  
dba0: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
dbb0: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
dbc0: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
dbd0: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
dbe0: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
dbf0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
dc00: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
dc10: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
dc20: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
dc30: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
dc40: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
dc50: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
dc60: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
dc70: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
dc80: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
dc90: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
dca0: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
dcb0: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
dcc0: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
dcd0: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
dce0: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
dcf0: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
dd00: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
dd10: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
dd20: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
dd30: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
dd40: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
dd50: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
dd60: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
dd70: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
dd80: 74 29 20 29 7b 0a 20 20 20 20 74 65 73 74 41 64  t) ){.    testAd
dd90: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
dda0: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
ddb0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ddc0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
ddd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
dde0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
ddf0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
de00: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
de10: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
de20: 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
de30: 42 51 55 45 52 59 20 25 64 22 2c 20 74 65 73 74  BQUERY %d", test
de40: 41 64 64 72 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  Addr>=0?"":"CORR
de50: 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
de60: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
de70: 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
de80: 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  R", pParse->iNex
de90: 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b  tSelectId.    );
dea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
deb0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
dec0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
ded0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
dee0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
def0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
df00: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
df10: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
df20: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
df30: 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
df40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
df50: 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
df60: 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
df70: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
df80: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
df90: 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 74 68  * Keyinfo for th
dfa0: 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
dfb0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  e */.      stati
dfc0: 63 20 75 38 20 73 6f 72 74 4f 72 64 65 72 20 3d  c u8 sortOrder =
dfd0: 20 30 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 61   0;    /* Fake a
dfe0: 53 6f 72 74 4f 72 64 65 72 20 66 6f 72 20 6b 65  SortOrder for ke
dff0: 79 49 6e 66 6f 20 2a 2f 0a 20 20 20 20 20 20 69  yInfo */.      i
e000: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
e010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
e020: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
e030: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
e040: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
e050: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
e060: 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
e070: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
e080: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  operator */..   
e090: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
e0a0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
e0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e0c0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
e0d0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20  rMayHaveNull);. 
e0e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66       }..      af
e0f0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e100: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
e110: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
e120: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
e130: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
e140: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
e150: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
e160: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
e170: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
e180: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
e190: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
e1a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
e1b0: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
e1c0: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
e1d0: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
e1e0: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
e1f0: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
e200: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
e210: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
e220: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
e230: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
e240: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
e250: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
e260: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
e270: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
e280: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
e290: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
e2a0: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
e2b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
e2c0: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
e2d0: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
e2e0: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
e2f0: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
e300: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
e310: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
e320: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
e330: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
e340: 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
e350: 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
e360: 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
e370: 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
e380: 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
e390: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
e3a0: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
e3b0: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
e3c0: 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
e3d0: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
e3e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
e3f0: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
e400: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
e410: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
e420: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
e430: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
e440: 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f  r->iTable, !isRo
e450: 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
e460: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 3d 3d 30 20  rMayHaveNull==0 
e470: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
e480: 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
e490: 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 20  NORDERED);.     
e4a0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
e4b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
e4c0: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
e4d0: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
e4e0: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61  .      keyInfo.a
e4f0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 26 73 6f 72  SortOrder = &sor
e500: 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 69  tOrder;..      i
e510: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
e520: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
e530: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
e540: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
e550: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
e560: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
e570: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
e580: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
e590: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
e5a0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
e5b0: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
e5c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
e5d0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
e5e0: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
e5f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e600: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
e610: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
e620: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
e630: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
e640: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
e650: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
e660: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
e670: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
e680: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
e690: 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75  est.affSdst = (u
e6a0: 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
e6b0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
e6c0: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
e6d0: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
e6e0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
e6f0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
e700: 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
e710: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
e720: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e730: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
e740: 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
e750: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
e760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e770: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
e780: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
e790: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66  List;.        if
e7a0: 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21  ( ALWAYS(pEList!
e7b0: 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 && pEList->nE
e7c0: 78 70 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20  xpr>0) ){ .     
e7d0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
e7e0: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[0] = sqlite3B
e7f0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
e800: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
e810: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
e820: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
e830: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
e840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e850: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
e860: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
e870: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
e880: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
e890: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
e8a0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e8b0: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
e8c0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
e8d0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
e8e0: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
e8f0: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
e900: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
e910: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
e920: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
e930: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
e940: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
e950: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
e960: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
e970: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
e980: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
e990: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
e9a0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
e9b0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
e9c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
e9d0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
e9e0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
e9f0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
ea00: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
ea10: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
ea20: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
ea30: 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
ea40: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
ea50: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
ea60: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
ea70: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
ea80: 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  }.        keyInf
ea90: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  o.aColl[0] = sql
eaa0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
eab0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
eac0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 6b  Left);.        k
ead0: 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65  eyInfo.aSortOrde
eae0: 72 20 3d 20 26 73 6f 72 74 4f 72 64 65 72 3b 0a  r = &sortOrder;.
eaf0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
eb00: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
eb10: 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
eb20: 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
eb30: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
eb40: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
eb50: 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
eb60: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
eb70: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
eb80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eb90: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
eba0: 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20   0, r2);.       
ebb0: 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
ebc0: 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
ebd0: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
ebe0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
ebf0: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
ec00: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
ec10: 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54         int iValT
ec20: 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20  oIns;..         
ec30: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
ec40: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
ec50: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
ec60: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
ec70: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
ec80: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
ec90: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
eca0: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
ecb0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
ecc0: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
ecd0: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
ece0: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
ecf0: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
ed00: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
ed10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
ed20: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
ed30: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
ed40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
ed50: 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20 26 26  ( testAddr>=0 &&
ed60: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
ed70: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ed90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
eda0: 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72 29  oop(v, testAddr)
edb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
edc0: 73 74 41 64 64 72 20 3d 20 2d 31 3b 0a 20 20 20  stAddr = -1;.   
edd0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
ede0: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
edf0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
ee00: 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
ee10: 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
ee20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
ee30: 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
ee40: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
ee50: 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
ee60: 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
ee70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee80: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
ee90: 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
eea0: 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
eeb0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
eec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
eed0: 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
eee0: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
eef0: 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
ef00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
ef10: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
ef20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
ef40: 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
ef70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ef80: 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
ef90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
efa0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
efb0: 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
efc0: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
efd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
efe0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
eff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f000: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
f010: 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32  ecord, r3, 1, r2
f020: 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
f030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f040: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
f050: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
f060: 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20  arse, r3, 1);.  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f080: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f090: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
f0a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
f0b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
f0c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
f0e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f0f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
f100: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f110: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f120: 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
f130: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
f140: 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
f150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f160: 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
f170: 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f  (void *)&keyInfo
f180: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
f190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f1a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
f1b0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
f1c0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
f1d0: 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  T:.    default: 
f1e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
f1f0: 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73  is has to be a s
f200: 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47  calar SELECT.  G
f210: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
f220: 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  put the.      **
f230: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73   value of this s
f240: 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72  elect in a memor
f250: 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72  y cell and recor
f260: 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  d the number.   
f270: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d     ** of the mem
f280: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
f290: 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73  umn.  If this is
f2a0: 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74   an EXISTS, writ
f2b0: 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  e.      ** an in
f2c0: 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69  teger 0 (not exi
f2d0: 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74  sts) or 1 (exist
f2e0: 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79  s) into a memory
f2f0: 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61   cell.      ** a
f300: 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d  nd record that m
f310: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
f320: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
f330: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
f340: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
f350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f360: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
f370: 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20  to encode */.   
f380: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
f390: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
f3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
f3b0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c  to deal with SEL
f3c0: 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20  ECt result */.. 
f3d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f3e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
f3f0: 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
f400: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f410: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
f420: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
f430: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
f440: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
f450: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20  TK_SELECT );..  
f460: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
f470: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f480: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
f490: 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d   );.      pSel =
f4a0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f4b0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
f4c0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f4d0: 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73  dest, 0, ++pPars
f4e0: 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  e->nMem);.      
f4f0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f500: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
f510: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
f520: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
f530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f540: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
f550: 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
f560: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
f570: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
f580: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
f590: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
f5a0: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
f5b0: 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
f5c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f5d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f5e0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
f5f0: 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
f600: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f610: 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
f620: 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
f630: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f640: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
f650: 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
f660: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
f670: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
f680: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
f690: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
f6a0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e        &sqlite3In
f6d0: 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20  tTokens[1]);.   
f6e0: 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20     pSel->iLimit 
f6f0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
f700: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f710: 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
f720: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f730: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
f740: 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
f750: 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
f760: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
f770: 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
f780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f790: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
f7a0: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>=0 ){.    sqli
f7b0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f7c0: 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20  v, testAddr);.  
f7d0: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
f7e0: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
f7f0: 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52  1);..  return rR
f800: 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
f810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
f820: 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
f830: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f840: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
f850: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
f860: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
f870: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
f880: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
f890: 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
f8a0: 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
f8b0: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
f8c0: 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
f8d0: 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
f8e0: 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d  ion.  The right-
f8f0: 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a  hand side (RHS).
f900: 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
f910: 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76  f zero or more v
f920: 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72  alues.  The expr
f930: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69  ession is true i
f940: 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20  f the LHS is.** 
f950: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
f960: 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76   the RHS.  The v
f970: 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72  alue of the expr
f980: 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77  ession is unknow
f990: 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74  n (NULL).** if t
f9a0: 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f  he LHS is NULL o
f9b0: 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  r if the LHS is 
f9c0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  not contained wi
f9d0: 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64  thin the RHS and
f9e0: 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74   the.** RHS cont
f9f0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
fa00: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
fa10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fa20: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
fa30: 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73  will jump to des
fa40: 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
fa50: 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
fa60: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
fa70: 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
fa80: 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
fa90: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
faa0: 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
fab0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
fac0: 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
fad0: 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
fae0: 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
faf0: 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
fb00: 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
fb10: 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74  l through..*/.st
fb20: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
fb30: 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
fb40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fb50: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
fb60: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
fb70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fb80: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
fb90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
fba0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
fbb0: 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
fbc0: 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
fbd0: 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
fbe0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
fbf0: 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
fc00: 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
fc10: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
fc20: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
fc30: 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
fc40: 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
fc50: 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
fc60: 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
fc70: 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
fc80: 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
fc90: 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  LL values */.  c
fca0: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
fcb0: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
fcc0: 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  on affinity to u
fcd0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  se */.  int eTyp
fce0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
fcf0: 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53   Type of the RHS
fd00: 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20   */.  int r1;   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fd20: 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
fd30: 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20  ister */.  Vdbe 
fd40: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
fd50: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
fd60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
fd70: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   */..  /* Comput
fd80: 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74  e the RHS.   Aft
fd90: 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68  er this step, th
fda0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
fdb0: 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e  sor.  ** pExpr->
fdc0: 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  iTable will cont
fdd0: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
fde0: 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
fdf0: 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   RHS..  */.  v =
fe00: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
fe10: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
fe20: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
fe30: 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
fe40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
fe50: 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
fe60: 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
fe70: 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
fe80: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
fe90: 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
fea0: 45 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e 75  Expr, &rRhsHasNu
feb0: 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ll);..  /* Figur
fec0: 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69  e out the affini
fed0: 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65  ty to use to cre
fee0: 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74  ate a key from t
fef0: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
ff00: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ff10: 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
ff20: 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
ff30: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
ff40: 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50  or.  ** P4 of OP
ff50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a  _MakeRecord..  *
ff60: 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63  /.  affinity = c
ff70: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
ff80: 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20  y(pExpr);..  /* 
ff90: 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68  Code the LHS, th
ffa0: 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
ffb0: 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
ffc0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
ffd0: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
ffe0: 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c  rse);.  r1 = sql
fff0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10000 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
10010 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10020 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10030 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r1);..  /* If th
10040 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74  e LHS is NULL, t
10050 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
10060 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f  s either false o
10070 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67  r NULL depending
10080 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72  .  ** on whether
10090 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74   the RHS is empt
100a0 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63  y or not, respec
100b0 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  tively..  */.  i
100c0 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  f( destIfNull==d
100d0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
100e0 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
100f0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
10100 65 20 77 68 65 72 65 20 74 68 65 20 66 61 6c 73  e where the fals
10110 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f  e and NULL outco
10120 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  mes are.    ** t
10130 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  he same. */.    
10140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10150 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
10160 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  r1, destIfNull);
10170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
10180 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
10190 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
101a0 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a  P_NotNull, r1);.
101b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
101c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
101d0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
101e0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  e, destIfFalse);
101f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10200 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
10210 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c  o, 0, destIfNull
10220 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10230 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10240 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  dr1);.  }..  if(
10250 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
10260 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
10270 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
10280 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
10290 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
102a0 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ree.    */.    s
102b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
102c0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
102d0 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73  , r1, destIfFals
102e0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
102f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10300 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72  NotExists, pExpr
10310 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
10320 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 7d 65  False, r1);.  }e
10330 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  lse{.    /* In t
10340 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
10350 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
10360 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tree..    */.   
10370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10380 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
10390 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66  y, r1, 1, 0, &af
103a0 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20  finity, 1);..   
103b0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d   /* If the set m
103c0 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66  embership test f
103d0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ails, then the r
103e0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20  esult of the .  
103f0 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29    ** "x IN (...)
10400 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  " expression mus
10410 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72  t be either 0 or
10420 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65   NULL. If the se
10430 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  t.    ** contain
10440 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  s no NULL values
10450 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10460 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73  t is 0. If the s
10470 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  et .    ** conta
10480 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
10490 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
104a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
104b0 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65  the.    ** expre
104c0 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
104d0 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  LL..    */.    i
104e0 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d  f( rRhsHasNull==
104f0 30 20 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65  0 || destIfFalse
10500 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a  ==destIfNull ){.
10510 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
10520 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20  anch runs if it 
10530 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70  is known at comp
10540 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68  ile time that th
10550 65 20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63  e RHS.      ** c
10560 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55  annot contain NU
10570 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  LL values. This 
10580 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72  happens as the r
10590 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f  esult.      ** o
105a0 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63  f a "NOT NULL" c
105b0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
105c0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
105d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
105e0 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69   ** Also run thi
105f0 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c  s branch if NULL
10600 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
10610 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a  o FALSE.      **
10620 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
10630 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
10640 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10660 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
10670 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
10680 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
10690 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 7d  , r1, 1);..    }
106a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
106b0 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74  n this branch, t
106c0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
106d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
106e0 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20   NULL and.      
106f0 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  ** the presence 
10700 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65  of a NULL on the
10710 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66   RHS makes a dif
10720 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20  ference in the. 
10730 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e       ** outcome.
10740 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10750 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a  int j1, j2, j3;.
10760 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  .      /* First 
10770 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
10780 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
10790 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
107a0 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a    If so,.      *
107b0 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65 73 65  * then the prese
107c0 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20  nce of NULLs in 
107d0 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74  the RHS does not
107e0 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70   matter, so jump
107f0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61  .      ** over a
10800 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ll of the code t
10810 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20  hat follows..   
10820 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d     */.      j1 =
10830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10840 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
10850 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
10860 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20  , 0, r1, 1);..  
10870 20 20 20 20 2f 2a 20 48 65 72 65 20 77 65 20 62      /* Here we b
10880 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
10890 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 69  code that runs i
108a0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
108b0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  .      ** contai
108c0 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
108d0 48 53 2e 20 20 47 65 6e 65 72 61 74 65 20 61 64  HS.  Generate ad
108e0 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65 20 74 68  ditional code th
108f0 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 65 73 74  at.      ** test
10900 73 20 74 68 65 20 52 48 53 20 66 6f 72 20 4e 55  s the RHS for NU
10910 4c 4c 73 2e 20 20 49 66 20 74 68 65 20 52 48 53  LLs.  If the RHS
10920 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
10930 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a   then.      ** j
10940 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
10950 6c 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  l.  If there are
10960 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65   no NULLs in the
10970 20 52 48 53 20 74 68 65 6e 0a 20 20 20 20 20 20   RHS then.      
10980 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  ** jump to destI
10990 66 46 61 6c 73 65 2e 0a 20 20 20 20 20 20 2a 2f  fFalse..      */
109a0 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  .      j2 = sqli
109b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
109c0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68   OP_NotNull, rRh
109d0 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
109e0 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j3 = sqlite3Vdb
109f0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
10a00 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
10a10 54 61 62 6c 65 2c 20 30 2c 20 72 52 68 73 48 61  Table, 0, rRhsHa
10a20 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20  sNull, 1);.     
10a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a40 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10a50 2c 20 2d 31 2c 20 72 52 68 73 48 61 73 4e 75 6c  , -1, rRhsHasNul
10a60 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
10a70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10a80 20 6a 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j3);.      sqli
10a90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10aa0 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 52 68 73   OP_AddImm, rRhs
10ab0 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20  HasNull, 1);.   
10ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10ad0 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 0a  mpHere(v, j2);..
10ae0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
10af0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
10b00 20 74 61 72 67 65 74 20 64 65 70 65 6e 64 69 6e   target dependin
10b10 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
10b20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  not.      ** the
10b30 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20   RHS contains a 
10b40 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20  NULL.      */.  
10b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10b60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
10b70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
10b80 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
10b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10ba0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
10bb0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a   destIfFalse);..
10bc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f        /* The OP_
10bd0 46 6f 75 6e 64 20 61 74 20 74 68 65 20 74 6f 70  Found at the top
10be0 20 6f 66 20 74 68 69 73 20 62 72 61 6e 63 68 20   of this branch 
10bf0 6a 75 6d 70 73 20 68 65 72 65 20 77 68 65 6e 20  jumps here when 
10c00 74 72 75 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20  true, .      ** 
10c10 63 61 75 73 69 6e 67 20 74 68 65 20 6f 76 65 72  causing the over
10c20 61 6c 6c 20 49 4e 20 65 78 70 72 65 73 73 69 6f  all IN expressio
10c30 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20  n evaluation to 
10c40 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 20 20  fall through..  
10c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
10c60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10c70 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 7d 0a 20  (v, j1);.    }. 
10c80 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
10c90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
10ca0 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  e, r1);.  sqlite
10cb0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
10cc0 61 72 73 65 2c 20 31 29 3b 0a 20 20 56 64 62 65  arse, 1);.  Vdbe
10cd0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
10ce0 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23   IN expr"));.}.#
10cf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10d00 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
10d10 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ../*.** Duplicat
10d20 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75  e an 8-byte valu
10d30 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
10d40 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65   *dup8bytes(Vdbe
10d50 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
10d60 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75  *in){.  char *ou
10d70 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
10d80 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64  locRaw(sqlite3Vd
10d90 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69  beDb(v), 8);.  i
10da0 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65  f( out ){.    me
10db0 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29  mcpy(out, in, 8)
10dc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
10dd0 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ut;.}..#ifndef S
10de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
10df0 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
10e00 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
10e10 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
10e20 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
10e30 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
10e40 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
10e50 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
10e60 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
10e70 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
10e80 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
10e90 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
10ea0 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
10eb0 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
10ec0 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
10ed0 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
10ee0 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
10ef0 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
10f00 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
10f10 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
10f20 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
10f30 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
10f40 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
10f50 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
10f60 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
10f70 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
10f80 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
10f90 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
10fa0 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
10fb0 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
10fc0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
10fd0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
10fe0 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
10ff0 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
11000 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
11010 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
11020 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
11030 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
11040 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20   -value;.    zV 
11050 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
11060 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
11070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11080 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
11090 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
110a0 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
110b0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
110c0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
110d0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
110e0 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
110f0 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
11100 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
11110 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
11120 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
11130 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
11140 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
11150 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
11160 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
11170 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
11180 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
11190 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
111a0 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
111b0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
111c0 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
111d0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
111e0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
111f0 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
11200 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
11210 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
11220 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
11230 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
11240 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11250 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
11260 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
11270 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
11280 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
11290 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
112a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
112b0 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
112c0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 41      c = sqlite3A
112d0 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 2c  toi64(z, &value,
112e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
112f0 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
11300 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20  );.    if( c==0 
11310 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46  || (c==2 && negF
11320 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 63 68  lag) ){.      ch
11330 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66  ar *zV;.      if
11340 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
11350 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c  ue = c==2 ? SMAL
11360 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
11370 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a 56 20  lue; }.      zV 
11380 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
11390 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
113a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
113b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74  AddOp4(v, OP_Int
113c0 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  64, 0, iMem, 0, 
113d0 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  zV, P4_INT64);. 
113e0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
113f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
11400 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
11410 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11420 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73  g(pParse, "overs
11430 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73  ized integer: %s
11440 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22  %s", negFlag ? "
11450 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c  -" : "", z);.#el
11460 73 65 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  se.      codeRea
11470 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
11480 20 69 4d 65 6d 29 3b 0a 23 65 6e 64 69 66 0a 20   iMem);.#endif. 
11490 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
114a0 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68 65 20  * Clear a cache 
114b0 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
114c0 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79   void cacheEntry
114d0 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
114e0 72 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c  rse, struct yCol
114f0 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28  Cache *p){.  if(
11500 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20   p->tempReg ){. 
11510 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
11520 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
11530 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
11540 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
11550 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
11560 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
11570 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  ] = p->iReg;.   
11580 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65   }.    p->tempRe
11590 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  g = 0;.  }.}.../
115a0 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74  *.** Record in t
115b0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
115c0 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61  that a particula
115d0 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a  r column from a.
115e0 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61  ** particular ta
115f0 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
11600 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
11610 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  gister..*/.void 
11620 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11630 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61  Store(Parse *pPa
11640 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69  rse, int iTab, i
11650 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65  nt iCol, int iRe
11660 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
11670 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74  nt minLru;.  int
11680 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63   idxLru;.  struc
11690 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
116a0 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
116b0 30 20 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  0 );  /* Registe
116c0 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  r numbers are al
116d0 77 61 79 73 20 70 6f 73 69 74 69 76 65 20 2a 2f  ways positive */
116e0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
116f0 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
11700 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
11710 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
11720 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
11730 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
11740 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
11750 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
11760 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
11770 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
11780 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
11790 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
117a0 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
117b0 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
117c0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
117d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
117e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
117f0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
11800 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
11810 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
11820 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
11830 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
11840 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
11850 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
11860 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
11870 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
11880 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
11890 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
118a0 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
118b0 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
118c0 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
118d0 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
118e0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
118f0 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
11900 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11910 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11920 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11930 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
11940 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20  ( p->iReg==0 || 
11950 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
11960 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
11970 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
11980 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20  f..  /* Find an 
11990 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72  empty slot and r
119a0 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66  eplace it */.  f
119b0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
119c0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
119d0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
119e0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
119f0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20   if( p->iReg==0 
11a00 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  ){.      p->iLev
11a10 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
11a20 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
11a30 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
11a40 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ;.      p->iColu
11a50 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
11a60 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
11a70 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
11a80 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  g = 0;.      p->
11a90 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
11aa0 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
11ab0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
11ac0 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65   }..  /* Replace
11ad0 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74   the last recent
11ae0 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e  ly used */.  min
11af0 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66  Lru = 0x7fffffff
11b00 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b  ;.  idxLru = -1;
11b10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
11b20 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
11b30 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
11b40 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11b50 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c  .    if( p->lru<
11b60 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20  minLru ){.      
11b70 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20  idxLru = i;.    
11b80 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
11b90 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  u;.    }.  }.  i
11ba0 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75  f( ALWAYS(idxLru
11bb0 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  >=0) ){.    p = 
11bc0 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
11bd0 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20  he[idxLru];.    
11be0 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
11bf0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
11c00 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
11c10 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43   iTab;.    p->iC
11c20 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
11c30 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
11c40 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  ;.    p->tempReg
11c50 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75   = 0;.    p->lru
11c60 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
11c70 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  eCnt++;.    retu
11c80 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
11c90 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72   Indicate that r
11ca0 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e  egisters between
11cb0 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67   iReg..iReg+nReg
11cc0 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65  -1 are being ove
11cd0 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72  rwritten..** Pur
11ce0 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ge the range of 
11cf0 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74  registers from t
11d00 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
11d10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11d20 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
11d30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11d40 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
11d50 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
11d60 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20  nt iLast = iReg 
11d70 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74  + nReg - 1;.  st
11d80 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
11d90 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
11da0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11db0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
11dc0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
11dd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
11de0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
11df0 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c  r>=iReg && r<=iL
11e00 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63  ast ){.      cac
11e10 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
11e20 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
11e30 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
11e40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
11e50 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
11e60 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
11e70 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
11e80 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
11e90 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
11ea0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
11eb0 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
11ec0 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
11ed0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
11ee0 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
11ef0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
11f00 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
11f10 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
11f20 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
11f30 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  el++;.}../*.** R
11f40 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63  emove from the c
11f50 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20  olumn cache any 
11f60 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72  entries that wer
11f70 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68  e added since th
11f80 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  e.** the previou
11f90 73 20 4e 20 50 75 73 68 20 6f 70 65 72 61 74 69  s N Push operati
11fa0 6f 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ons.  In other w
11fb0 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 20 74 68  ords, restore th
11fc0 65 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68  e cache.** to th
11fd0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
11fe0 6e 20 4e 20 50 75 73 68 65 73 20 61 67 6f 2e 0a  n N Pushes ago..
11ff0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12000 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73  xprCachePop(Pars
12010 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 4e  e *pParse, int N
12020 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
12030 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
12040 70 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  p;.  assert( N>0
12050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12060 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12070 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=N );.  pParse
12080 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d  ->iCacheLevel -=
12090 20 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   N;.  for(i=0, p
120a0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
120b0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
120c0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
120d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
120e0 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c  Reg && p->iLevel
120f0 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
12100 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
12110 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
12120 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
12130 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
12140 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12150 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f  When a cached co
12160 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20  lumn is reused, 
12170 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69  make sure that i
12180 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ts register is.*
12190 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69  * no longer avai
121a0 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20  lable as a temp 
121b0 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65  register.  ticke
121c0 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73  t #3879:  that s
121d0 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ame.** register 
121e0 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20  might be in the 
121f0 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c  cache in multipl
12200 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20  e places, so be 
12210 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74  sure to.** get t
12220 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  hem all..*/.stat
12230 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
12240 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
12250 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
12260 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
12270 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
12280 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
12290 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
122a0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
122b0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
122c0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
122d0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
122e0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
122f0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
12300 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12310 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12320 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
12330 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
12340 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
12350 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
12360 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
12370 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
12380 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
12390 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
123a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
123b0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
123c0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
123d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
123e0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
123f0 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
12400 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 69  e cursor for thi
12410 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
12420 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20   iCol,       /* 
12430 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
12440 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a  umn to extract *
12450 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
12460 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
12470 68 65 20 76 61 6c 75 64 20 69 6e 74 6f 20 74 68  he valud into th
12480 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
12490 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c  {.  if( iCol<0 |
124a0 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  | iCol==pTab->iP
124b0 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
124c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
124d0 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75  OP_Rowid, iTabCu
124e0 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
124f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  lse{.    int op 
12500 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
12510 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a  ) ? OP_VColumn :
12520 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
12530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12540 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
12550 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
12560 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
12570 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12580 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
12590 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
125a0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
125b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
125c0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
125d0 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
125e0 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
125f0 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
12600 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
12610 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
12620 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72  ister.  An effor
12630 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
12640 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
12650 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
12660 65 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69  er iReg, but thi
12670 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72  s is.** not guar
12680 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63  anteed.  The loc
12690 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ation of the col
126a0 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74  umn value is ret
126b0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
126c0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
126d0 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
126e0 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
126f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
12700 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
12710 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
12720 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
12730 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
12740 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
12750 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12760 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
12770 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
12780 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
12790 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
127a0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
127b0 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
127c0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
127d0 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
127e0 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
127f0 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
12800 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
12810 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
12820 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
12830 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
12840 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
12850 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
12860 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
12870 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
12880 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
12890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
128a0 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
128b0 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  umn */.){.  Vdbe
128c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
128d0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
128e0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
128f0 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c   *p;..  for(i=0,
12900 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12910 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12920 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12930 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
12940 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54  >iReg>0 && p->iT
12950 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
12960 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
12970 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  umn ){.      p->
12980 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
12990 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
129a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
129b0 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61  ePinRegister(pPa
129c0 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20  rse, p->iReg);. 
129d0 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
129e0 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  Reg;.    }.  }  
129f0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12a00 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
12a10 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
12a20 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
12a30 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
12a40 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
12a50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12a60 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
12a70 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20  ;.  }else{   .  
12a80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12a90 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
12aa0 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
12ab0 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65   iReg);.  }.  re
12ac0 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
12ad0 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
12ae0 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
12af0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
12b00 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
12b10 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  r(Parse *pParse)
12b20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
12b30 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
12b40 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
12b50 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
12b60 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
12b70 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
12b80 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
12b90 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
12ba0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
12bb0 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
12bc0 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
12bd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
12be0 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
12bf0 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  at an affinity c
12c00 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
12c10 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20  ed on iCount.** 
12c20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
12c30 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a  ng with iStart..
12c40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12c50 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
12c60 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  Change(Parse *pP
12c70 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74  arse, int iStart
12c80 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20  , int iCount){. 
12c90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12ca0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
12cb0 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b  iStart, iCount);
12cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
12cd0 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
12ce0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
12cf0 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
12d00 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
12d10 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
12d20 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65  nReg-1. Keep the
12d30 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70   column cache up
12d40 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  -to-date..*/.voi
12d50 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
12d60 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  eMove(Parse *pPa
12d70 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
12d80 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
12d90 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
12da0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
12db0 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  *p;.  if( NEVER(
12dc0 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65  iFrom==iTo) ) re
12dd0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
12de0 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
12df0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
12e00 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
12e10 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  eg);.  for(i=0, 
12e20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
12e30 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
12e40 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
12e50 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ++){.    int x =
12e60 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
12e70 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c  ( x>=iFrom && x<
12e80 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20  iFrom+nReg ){.  
12e90 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69      p->iReg += i
12ea0 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a  To-iFrom;.    }.
12eb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
12ec0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
12ed0 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  py content from 
12ee0 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
12ef0 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
12f00 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
12f10 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f  To+nReg-1..*/.vo
12f20 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
12f30 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
12f40 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
12f50 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
12f60 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
12f70 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d  if( NEVER(iFrom=
12f80 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a  =iTo) ) return;.
12f90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
12fa0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  g; i++){.    sql
12fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
12fc0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
12fd0 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20  _Copy, iFrom+i, 
12fe0 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  iTo+i);.  }.}..#
12ff0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13000 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
13010 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
13020 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
13030 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
13040 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
13050 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
13060 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
13070 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
13080 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
13090 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
130a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
130b0 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
130c0 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
130d0 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
130e0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
130f0 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
13100 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
13110 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
13120 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
13130 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
13140 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
13150 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
13160 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
13170 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
13180 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
13190 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
131a0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
131b0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
131c0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
131d0 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
131e0 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
131f0 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
13200 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
13210 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
13220 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
13230 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  GE_TEST */../*.*
13240 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13250 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
13260 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
13270 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
13280 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
13290 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
132a0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
132b0 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
132c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
132d0 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
132e0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
132f0 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
13300 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
13310 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
13320 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
13330 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
13340 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
13350 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
13360 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
13370 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
13380 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
13390 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
133a0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
133b0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
133c0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
133d0 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
133e0 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
133f0 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
13400 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13410 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
13420 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
13430 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
13440 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
13450 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13460 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
13470 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
13480 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
134b0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
134c0 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
134d0 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
134e0 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
134f0 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
13500 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
13510 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
13520 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
13530 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
13540 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
13550 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
13560 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
13570 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
13580 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
13590 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
135a0 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20  r2, r3, r4;     
135b0 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
135c0 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
135d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
135e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
135f0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
13600 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73  nection */..  as
13610 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
13620 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
13630 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
13640 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
13650 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
13660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
13670 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
13680 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
13690 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
136a0 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
136b0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
136c0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
136d0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
136e0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
136f0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
13700 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
13710 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
13720 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
13730 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
13740 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
13750 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
13760 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
13770 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
13780 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13790 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
137a0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
137b0 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
137c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
137d0 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
137e0 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
137f0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
13800 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13810 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
13820 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
13830 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
13860 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
13870 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
13880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13890 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
138a0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
138b0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
138c0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
138d0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
138e0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
138f0 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
13900 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
13910 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
13920 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
13930 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
13940 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
13950 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20  ->ckBase>0 );.  
13960 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
13970 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
13980 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
13990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
139a0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
139b0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
139c0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
139d0 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
13a00 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  ->iColumn, pExpr
13a10 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
13a20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a     pExpr->op2);.
13a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13a60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13a70 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
13a80 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
13a90 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
13aa0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
13ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13ac0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13ad0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
13ae0 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
13af0 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
13b00 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13b10 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13b20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13b30 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
13b40 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
13b50 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
13b60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13b70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
13b80 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
13b90 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
13ba0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
13bb0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
13bc0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
13bd0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13be0 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74  OP_String8, 0, t
13bf0 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  arget, 0, pExpr-
13c00 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20  >u.zToken, 0);. 
13c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13c20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
13c30 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
13c40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13c50 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
13c60 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
13c70 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
13c80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
13c90 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
13ca0 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
13cb0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
13cc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
13cd0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f        char *zBlo
13ce0 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
13cf0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
13d00 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
13d10 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
13d20 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
13d30 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c  zToken[0]=='x' |
13d40 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  | pExpr->u.zToke
13d50 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20  n[0]=='X' );.   
13d60 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13d70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27  ->u.zToken[1]=='
13d80 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  \'' );.      z =
13d90 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   &pExpr->u.zToke
13da0 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20  n[2];.      n = 
13db0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13dc0 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  z) - 1;.      as
13dd0 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27  sert( z[n]=='\''
13de0 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20   );.      zBlob 
13df0 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  = sqlite3HexToBl
13e00 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ob(sqlite3VdbeDb
13e10 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (v), z, n);.    
13e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e30 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
13e40 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  n/2, target, 0, 
13e50 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49  zBlob, P4_DYNAMI
13e60 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
13e70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
13e80 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
13e90 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LE: {.      asse
13ea0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
13eb0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
13ec0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
13ed0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13ee0 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a  >u.zToken!=0 );.
13ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13f00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
13f10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
13f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13f30 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
13f40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  Expr->iColumn, t
13f50 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
13f60 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
13f70 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  n[1]!=0 ){.     
13f80 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13f90 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
13fa0 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?' .            
13fb0 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72   || strcmp(pExpr
13fc0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72  ->u.zToken, pPar
13fd0 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d  se->azVar[pExpr-
13fe0 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20  >iColumn-1])==0 
13ff0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14000 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
14010 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a  , -1, pParse->az
14020 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Var[pExpr->iColu
14030 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43  mn-1], P4_STATIC
14040 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14060 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
14070 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  ER: {.      inRe
14080 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  g = pExpr->iTabl
14090 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
140a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
140b0 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_AS: {.      in
140c0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
140d0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
140e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
140f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14100 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
14110 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14120 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
14130 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
14140 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
14150 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
14160 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
14170 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
14180 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20   aff, to_op;.   
14190 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
141a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
141b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
141c0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
141d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
141e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
141f0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
14200 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20  e) );.      aff 
14210 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
14220 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
14230 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f  Token);.      to
14240 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
14250 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
14260 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
14270 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14280 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
14290 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
142a0 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
142b0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
142c0 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
142d0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
142e0 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
142f0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14300 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
14310 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
14320 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
14330 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14340 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
14350 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
14360 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
14370 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14380 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
14390 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
143a0 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74  AL    );.      t
143b0 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
143c0 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20  OP_ToText );.   
143d0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
143e0 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b  op==OP_ToBlob );
143f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14400 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
14410 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65  eric );.      te
14420 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
14430 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20  P_ToInt );.     
14440 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
14450 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20  ==OP_ToReal );. 
14460 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
14470 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
14480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14490 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
144a0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
144b0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
144c0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
144d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
144e0 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
144f0 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
14500 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
14510 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
14520 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
14530 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
14540 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
14550 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
14560 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
14570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14580 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14590 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
145a0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
145b0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
145c0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
145d0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
145e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
145f0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
14600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14610 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
14620 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14630 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
14640 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
14650 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
14660 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
14670 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
14680 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
14690 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
146a0 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
146b0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
146c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
146d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
146e0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
146f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14700 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
14710 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14720 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
14730 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14740 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
14750 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
14760 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
14770 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14780 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14790 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
147a0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
147b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
147c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
147d0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
147e0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
147f0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
14800 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
14810 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
14820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14830 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
14840 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
14850 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14860 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
14870 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14880 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14890 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
148a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
148b0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
148c0 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
148d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
148e0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
148f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
14900 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
14910 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14920 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14930 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
14940 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
14950 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14960 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14970 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
14980 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
14990 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
149a0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
149b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
149c0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
149d0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
149e0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
14a00 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
14a10 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51  ITE_STOREP2 | SQ
14a20 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
14a30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14a40 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
14a50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14a60 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
14a70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14a80 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
14a90 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
14aa0 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
14ab0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
14ac0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
14ad0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
14ae0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
14af0 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
14b00 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
14b10 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
14b20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
14b30 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
14b40 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
14b50 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
14b60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14b70 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
14b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14b90 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
14ba0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14bb0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
14bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14bd0 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
14be0 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
14bf0 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
14c00 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
14c10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
14c20 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
14c30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14c40 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
14c50 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
14c60 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
14c70 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
14c80 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
14c90 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
14ca0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
14cb0 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
14cc0 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
14cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14ce0 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
14cf0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
14d00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
14d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d20 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
14d30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d40 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
14d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14d60 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
14d70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14d80 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
14d90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14da0 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
14db0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14dc0 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
14dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14de0 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
14df0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14e00 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20  ==TK_LSHIFT );. 
14e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14e20 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
14e30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e40 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
14e50 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14e60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14e70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14e80 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
14e90 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
14ea0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14eb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14ec0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
14ed0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
14ee0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
14ef0 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
14f00 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
14f10 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14f20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14f30 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
14f40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14f50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14f60 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
14f70 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
14f80 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
14f90 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
14fa0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
14fb0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
14fc0 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
14fd0 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
14fe0 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
14ff0 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  get);.#ifndef SQ
15000 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
15010 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
15020 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
15030 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
15040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15050 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15060 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15070 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
15080 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
15090 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
150a0 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a  target);.#endif.
150b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
150c0 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
150d0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
150e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
150f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15110 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b  Integer, 0, r1);
15120 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
15130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15140 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
15150 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
15160 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
15170 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15180 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
15190 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
151a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
151b0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
151c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
151d0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
151e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
151f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
15200 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
15210 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
15220 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
15230 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
15240 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
15250 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
15260 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15270 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
15280 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15290 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
152a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
152b0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
152c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
152d0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
152e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
152f0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
15300 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
15310 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
15320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
15330 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
15340 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15350 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
15360 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
15370 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
15380 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
15390 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
153a0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
153b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
153c0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
153d0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
153e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
153f0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
15400 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15410 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
15420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15430 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15440 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
15450 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15460 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15470 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15480 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
15490 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
154a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
154b0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
154c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
154d0 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
154e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
154f0 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
15500 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20   target, -1);.  
15510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
15520 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
15530 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15540 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15550 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
15560 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
15570 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
15580 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
15590 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
155a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
155b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
155c0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
155d0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
155e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
155f0 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
15600 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
15610 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
15620 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
15630 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
15640 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
15650 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
15660 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
15670 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15680 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
15690 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
156a0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
156b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
156c0 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
156d0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
156e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
156f0 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
15700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15710 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
15720 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
15730 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
15740 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15750 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
15760 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
15770 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
15780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
15790 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63  ngth of the func
157a0 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74  tion name in byt
157b0 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  es */.      cons
157c0 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
157d0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
157e0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
157f0 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
15800 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
15810 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
15820 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
15830 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
15840 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
15850 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15860 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
15870 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
15880 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
15890 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
158a0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
158b0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
158c0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
158d0 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
158e0 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
158f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15900 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15910 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
15920 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  t) );.      test
15930 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
15940 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20  ST_FUNC );.     
15950 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15960 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
15970 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41      if( ExprHasA
15980 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
15990 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
159a0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
159b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
159c0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
159d0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
159e0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
159f0 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
15a00 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
15a10 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
15a20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15a30 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
15a40 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
15a50 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
15a60 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20  oken;.      nId 
15a70 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15a80 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44  0(zId);.      pD
15a90 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
15aa0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
15ab0 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e  , nId, nFarg, en
15ac0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  c, 0);.      if(
15ad0 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
15ae0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15af0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
15b00 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
15b10 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64  .*s()", nId, zId
15b20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
15b30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15b40 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
15b50 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
15b60 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
15b70 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
15b80 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
15b90 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
15ba0 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
15bb0 65 63 65 73 73 61 72 79 20 65 76 61 6c 61 74 69  ecessary evalati
15bc0 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
15bd0 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
15be0 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
15bf0 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
15c00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
15c10 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
15c20 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
15c30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15c40 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71  endCoalesce = sq
15c50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15c60 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61  el(v);.        a
15c70 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
15c80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15c90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
15ca0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
15cb0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
15cc0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
15cd0 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
15ce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15cf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15d00 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
15d10 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
15d20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15d30 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
15d40 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c  (pParse, target,
15d50 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
15d60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15d70 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
15d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15d90 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
15da0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
15db0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15dc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15dd0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
15de0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
15df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15e00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15e10 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
15e20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15e30 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69       }...      i
15e40 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
15e50 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15e60 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
15e70 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a 20 20  rse, nFarg);..  
15e80 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
15e90 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
15ea0 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
15eb0 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
15ec0 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
15ed0 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
15ee0 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
15ef0 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
15f00 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
15f10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
15f20 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
15f30 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
15f40 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
15f50 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
15f60 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
15f70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
15f80 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  f( (pDef->flags 
15f90 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
15fa0 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
15fb0 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
15fc0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
15fd0 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
15fe0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
15ff0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
16000 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
16010 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
16020 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
16030 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
16040 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
16050 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
16060 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
16070 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
16080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16090 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
160a0 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
160b0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
160c0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
160d0 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
160e0 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
160f0 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
16100 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16110 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 3d 3d 53  ( pDef->flags==S
16120 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
16130 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  H );.           
16140 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
16150 70 72 2d 3e 6f 70 32 20 3d 20 70 44 65 66 2d 3e  pr->op2 = pDef->
16160 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
16170 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
16180 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16190 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
161a0 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
161b0 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
161c0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
161d0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
161e0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
161f0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
16200 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16210 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
16220 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
16230 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
16240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16250 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
16260 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
16270 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
16280 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
16290 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
162a0 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
162b0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
162c0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
162d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
162e0 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
162f0 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
16300 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
16310 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
16320 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
16330 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
16340 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
16350 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
16360 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
16370 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
16380 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
16390 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
163a0 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
163b0 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
163c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
163d0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
163e0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
163f0 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
16400 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
16410 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
16420 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
16430 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
16440 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
16450 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
16460 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
16470 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
16480 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
16490 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
164a0 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
164b0 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
164c0 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
164d0 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
164e0 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
164f0 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
16500 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
16510 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
16520 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
16530 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
16540 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
16550 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
16560 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
16570 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
16580 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
16590 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
165a0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
165b0 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
165c0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
165d0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
165e0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
165f0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
16600 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
16610 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
16620 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
16630 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
16640 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
16650 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
16660 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
16670 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
16680 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
16690 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
166a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
166b0 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
166c0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
166d0 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
166e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
166f0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
16700 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
16710 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
16720 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
16730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16740 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  f( pDef->flags &
16750 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
16760 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
16770 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
16780 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
16790 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
167a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
167b0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
167c0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
167d0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
167e0 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
167f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16800 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
16810 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
16820 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
16850 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
16860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16870 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
16880 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
16890 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  nFarg ){.       
168a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
168b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
168c0 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
168d0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
168e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
168f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16900 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
16910 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
16920 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
16930 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16940 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
16950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16960 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
16970 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
16980 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
16990 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
169a0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
169b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
169c0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
169d0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
169e0 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
169f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16a00 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
16a10 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
16a20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16a40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
16a50 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
16a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16a70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
16a80 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
16a90 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
16aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16ac0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
16ad0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16ae0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16af0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
16b00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16b20 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
16b30 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
16b40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16b50 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
16b60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16b70 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
16b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16b90 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
16ba0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
16bb0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
16bc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
16bd0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
16be0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
16bf0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
16c00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
16c10 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
16c20 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
16c30 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
16c40 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
16c50 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
16c60 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
16c70 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
16c80 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
16c90 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
16ca0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
16cb0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16cc0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
16cd0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
16ce0 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
16cf0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
16d00 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
16d10 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
16d20 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31  pExpr;..      r1
16d30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16d40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16d50 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16d60 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
16d70 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16d80 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
16d90 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
16da0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16db0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
16dc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16dd0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
16de0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
16df0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16e00 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
16e10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
16e20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
16e30 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
16e40 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
16e50 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
16e60 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
16e70 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
16e80 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  EP2);.      pLIt
16e90 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
16ea0 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
16eb0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
16ec0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16ed0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
16ee0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
16ef0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16f00 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
16f10 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
16f20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16f30 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
16f40 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
16f50 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
16f60 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
16f70 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f   r2, r4, SQLITE_
16f80 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
16f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fa0 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
16fb0 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
16fc0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16fd0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16fe0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
16ff0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17000 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
17010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17020 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
17030 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
17040 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
17050 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
17060 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17070 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17080 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17090 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
170a0 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
170b0 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
170c0 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
170d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
170e0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
170f0 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
17100 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
17110 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
17120 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
17130 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
17140 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
17150 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
17160 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
17170 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
17180 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
17190 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
171a0 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
171b0 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
171c0 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
171d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
171e0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
171f0 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
17200 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
17210 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
17220 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
17230 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17240 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
17250 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
17260 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
17270 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
17280 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
17290 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
172a0 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
172b0 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
172c0 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
172d0 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
172e0 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
172f0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
17300 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
17310 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
17320 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
17330 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
17340 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
17350 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
17360 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
17370 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
17380 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17390 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
173a0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
173b0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
173c0 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
173d0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
173e0 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
173f0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
17400 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
17410 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
17420 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
17430 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
17440 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
17450 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
17460 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
17470 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
17480 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
17490 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
174a0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
174b0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
174c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
174d0 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
174e0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
174f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17500 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
17510 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
17520 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
17530 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
17540 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
17550 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
17560 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
17570 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
17580 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
17590 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
175a0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
175b0 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
175c0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
175d0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
175e0 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
175f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
17600 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
17610 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
17620 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
17630 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
17640 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
17650 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
17660 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17670 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
17680 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
17690 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
176a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
176b0 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
176c0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
176d0 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
176e0 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
176f0 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
17700 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
17710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17720 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
17730 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17740 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17750 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c   "%s.%s -> $%d",
17760 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
17770 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
17780 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
17790 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
177a0 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
177b0 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
177c0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
177d0 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ].zName),.      
177e0 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29    target.      )
177f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
17800 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
17810 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
17820 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
17830 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
17840 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
17850 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
17860 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
17870 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
17880 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
17890 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
178a0 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20  y real.  */.    
178b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
178c0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
178d0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
178e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
178f0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
17900 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
17910 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17920 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
17930 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
17940 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
17950 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
17960 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
17970 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
17980 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
17990 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
179a0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
179b0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
179c0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
179d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
179e0 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
179f0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
17a00 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
17a10 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
17a20 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
17a30 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
17a40 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
17a50 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
17a60 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
17a70 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
17a80 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
17a90 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
17aa0 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
17ab0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
17ac0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
17ad0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
17ae0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
17af0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
17b00 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
17b10 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
17b20 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e   Y is in pExpr->
17b30 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20 69  pRight.  The Y i
17b40 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  s also optional.
17b50 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
17b60 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61  .    ** ELSE cla
17b70 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  use and no other
17b80 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74   term matches, t
17b90 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
17ba0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70  f the.    ** exp
17bb0 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a  rssion is NULL..
17bc0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
17bd0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
17be0 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
17bf0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
17c00 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
17c10 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
17c20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
17c30 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
17c40 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
17c50 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
17c60 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
17c70 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
17c80 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
17c90 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
17ca0 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
17cb0 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
17cc0 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
17cd0 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
17ce0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
17cf0 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d10 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
17d20 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
17d30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
17d40 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
17d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
17d60 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
17d70 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
17d80 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
17d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17da0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
17db0 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
17dc0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
17dd0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17df0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
17e00 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
17e10 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
17e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
17e30 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
17e40 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
17e50 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
17e60 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
17e70 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
17e80 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
17e90 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17eb0 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
17ec0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
17ed0 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20 20  pr cacheX;      
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65 73  /* Cached expres
17f00 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20  sion X */.      
17f10 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
17f40 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
17f50 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
17f80 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
17f90 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20  orm B) */.      
17fa0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43  VVA_ONLY( int iC
17fb0 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72  acheLevel = pPar
17fc0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
17fd0 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   )..      assert
17fe0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
17ff0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
18000 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
18010 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20  ->x.pList );.   
18020 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
18030 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
18040 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20   % 2) == 0);.   
18050 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
18060 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
18070 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
18080 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
18090 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
180a0 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
180b0 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
180c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
180d0 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
180e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
180f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
18100 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e  f( (pX = pExpr->
18110 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
18120 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70       cacheX = *p
18130 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
18140 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
18150 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
18160 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
18170 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
18180 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
18190 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
181a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
181b0 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
181c0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74  ree1);.        t
181d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
181e0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
181f0 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
18200 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
18210 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
18220 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
18230 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
18240 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
18250 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
18260 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
18270 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
18280 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
18290 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
182a0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
182b0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
182c0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
182d0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
182e0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
182f0 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
18300 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
18310 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
18320 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
18330 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
18340 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
18350 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
18360 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
18370 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
18380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
18390 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
183a0 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
183b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
183c0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
183d0 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
183e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
183f0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
18400 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
18410 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
18420 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
18430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18440 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
18450 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
18460 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
18470 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
18480 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18490 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
184a0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
184b0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
184c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
184d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
184e0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
184f0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
18500 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
18510 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
18520 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
18530 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
18540 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
18550 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
18560 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
18570 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
18580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18590 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
185a0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
185b0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
185c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
185d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
185e0 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
185f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18600 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
18610 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
18620 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18630 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
18640 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
18650 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18660 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
18670 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
18680 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
18690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
186a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
186b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
186c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
186d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
186e0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
186f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
18720 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
18730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
18740 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
18750 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
18760 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
18770 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
18780 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
18790 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
187a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
187b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
187c0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
187d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
187e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
187f0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
18800 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
18810 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18820 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
18830 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
18840 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
18850 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
18860 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
18870 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
18880 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
18890 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
188a0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
188b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
188c0 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
188d0 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
188e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
188f0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18910 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
18920 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
18930 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
18940 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
18950 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
18960 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
18970 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
18980 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
18990 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
189a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
189b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
189c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
189d0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
189e0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
189f0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
18a00 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
18a10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18a20 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
18a30 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
18a40 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
18a50 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
18a60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
18a70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18a80 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
18a90 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
18aa0 65 2c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  e, pExpr->affini
18ab0 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
18ac0 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ken, 0);.      }
18ad0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
18ae0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
18af0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18b00 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18b10 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
18b20 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18b30 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
18b40 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
18b50 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nReg;.}../*.** G
18b60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
18b70 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
18b80 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
18b90 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
18ba0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
18bb0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
18bc0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
18bd0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
18be0 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
18bf0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
18c00 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
18c10 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
18c20 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
18c30 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
18c40 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
18c50 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
18c60 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
18c70 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
18c80 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
18c90 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
18ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
18cb0 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
18cc0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
18cd0 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
18ce0 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  g){.  int r1 = s
18cf0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18d00 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
18d10 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
18d20 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
18d30 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
18d40 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
18d50 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
18d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
18d70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18d80 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18d90 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
18da0 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
18db0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18dc0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
18dd0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
18de0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
18df0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
18e00 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
18e10 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
18e20 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
18e30 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
18e40 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
18e50 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
18e60 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
18e70 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
18e80 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
18e90 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
18ea0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
18eb0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
18ec0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
18ed0 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
18ee0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
18ef0 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
18f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
18f10 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
18f20 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
18f30 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
18f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
18f50 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
18f60 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
18f70 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
18f80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
18f90 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70  arse->pVdbe || p
18fa0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18fb0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
18fc0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
18fd0 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
18fe0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
18ff0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
19000 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
19010 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
19020 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
19030 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
19040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
19050 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
19060 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  lutes the given 
19070 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
19080 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
19090 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
190a0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
190b0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
190c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
190d0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
190e0 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
190f0 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
19100 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
19110 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
19120 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
19130 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
19140 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
19150 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
19160 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
19170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
19180 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
19190 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
191a0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
191b0 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
191c0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
191d0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
191e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
191f0 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
19200 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
19210 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61  rCodeAndCache(Pa
19220 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
19230 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
19240 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
19250 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19260 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20  ;.  int inReg;. 
19270 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
19280 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
19290 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
192a0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
192b0 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73  t>0 );.  /* This
192c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
192d0 65 64 20 66 6f 72 20 74 65 72 6d 73 20 74 6f 20  ed for terms to 
192e0 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
192f0 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a  .  And the only.
19300 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63 65    ** other place
19310 20 77 68 65 72 65 20 65 78 70 72 65 73 73 69 6f   where expressio
19320 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  ns can be conver
19330 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49  ted into TK_REGI
19340 53 54 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20  STER is.  ** in 
19350 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
19360 63 65 73 73 69 6e 67 2e 20 20 53 6f 20 61 73 20  cessing.  So as 
19370 63 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d  currently implem
19380 65 6e 74 65 64 2c 20 74 68 65 72 65 20 69 73 0a  ented, there is.
19390 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20    ** no way for 
193a0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 74 6f  a TK_REGISTER to
193b0 20 65 78 69 73 74 20 68 65 72 65 2e 20 20 42 75   exist here.  Bu
193c0 74 20 69 74 20 73 65 65 6d 73 20 70 72 75 64 65  t it seems prude
193d0 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  nt to.  ** keep 
193e0 74 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e 20  the ALWAYS() in 
193f0 63 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74 69  case the conditi
19400 6f 6e 73 20 61 62 6f 76 65 20 63 68 61 6e 67 65  ons above change
19410 20 77 69 74 68 20 66 75 74 75 72 65 0a 20 20 2a   with future.  *
19420 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  * modifications 
19430 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e  or enhancements.
19440 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
19450 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52  (pExpr->op!=TK_R
19460 45 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20 20  EGISTER) ){  .  
19470 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20    int iMem;.    
19480 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
19490 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
194a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
194b0 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  OP_Copy, inReg, 
194c0 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72  iMem);.    pExpr
194d0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b  ->iTable = iMem;
194e0 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20  .    pExpr->op2 
194f0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  = pExpr->op;.   
19500 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
19510 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20  REGISTER;.  }.  
19520 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
19530 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19540 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
19550 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
19560 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
19570 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61  readable explana
19580 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65  tion of an expre
19590 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
195a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61  oid sqlite3Expla
195b0 69 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75  inExpr(Vdbe *pOu
195c0 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
195d0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195f0 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
19600 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73   coded */.  cons
19610 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d  t char *zBinOp =
19620 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20   0;   /* Binary 
19630 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f  operator */.  co
19640 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70  nst char *zUniOp
19650 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79   = 0;   /* Unary
19660 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
19670 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
19680 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
19690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
196a0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
196b0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
196c0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
196d0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
196e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
196f0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47  Printf(pOut, "AG
19700 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20  G{%d:%d}",.     
19710 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
19720 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
19730 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  lumn);.      bre
19740 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19750 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
19760 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
19770 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20  >iTable<0 ){.   
19780 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c       /* This onl
19790 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
197a0 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73  oding check cons
197b0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
197c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
197d0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43  nPrintf(pOut, "C
197e0 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70  OLUMN(%d)", pExp
197f0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
19800 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19810 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19820 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25  Printf(pOut, "{%
19830 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  d:%d}",.        
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
19860 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
19870 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mn);.      }.   
19880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19890 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
198a0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  GER: {.      if(
198b0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
198c0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
198d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
198e0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
198f0 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75  , "%d", pExpr->u
19900 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  .iValue);.      
19910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
19920 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
19930 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c 20  ntf(pOut, "%s", 
19940 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
19950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
19970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19980 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
19990 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
199a0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
199b0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
199c0 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72  pOut,"%s", pExpr
199d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
199e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
199f0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
19a00 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
19a10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19a20 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 51  nPrintf(pOut,"%Q
19a30 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
19a40 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
19a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19a60 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
19a70 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19a80 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c  Printf(pOut,"NUL
19a90 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
19aa0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
19ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
19ac0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
19ad0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
19ae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19af0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73  nPrintf(pOut,"%s
19b00 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
19b10 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
19b20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
19b30 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
19b40 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
19b50 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19b60 66 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c 45  f(pOut,"VARIABLE
19b70 28 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20  (%s,%d)",.      
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
19ba0 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f  oken, pExpr->iCo
19bb0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  lumn);.      bre
19bc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19bd0 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
19be0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
19bf0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
19c00 74 2c 22 52 45 47 49 53 54 45 52 28 25 64 29 22  t,"REGISTER(%d)"
19c10 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
19c20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19c30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
19c40 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _AS: {.      sql
19c50 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
19c60 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
19c70 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ft);.      break
19c80 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
19c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
19ca0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
19cb0 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
19cc0 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
19cd0 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
19ce0 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
19cf0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
19d00 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b  r *zAff = "unk";
19d10 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73  .      switch( s
19d20 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
19d30 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
19d40 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  en) ){.        c
19d50 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
19d60 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20 22  EXT:    zAff = "
19d70 54 45 58 54 22 3b 20 20 20 20 20 62 72 65 61 6b  TEXT";     break
19d80 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
19d90 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20  QLITE_AFF_NONE: 
19da0 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45 22     zAff = "NONE"
19db0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19dc0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
19dd0 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a 41  _AFF_NUMERIC: zA
19de0 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 20  ff = "NUMERIC"; 
19df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19e00 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
19e10 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d 20  INTEGER: zAff = 
19e20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65 61  "INTEGER";  brea
19e30 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
19e40 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a  SQLITE_AFF_REAL:
19e50 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41 4c      zAff = "REAL
19e60 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
19e70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
19e80 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19e90 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73 28  (pOut, "CAST-%s(
19ea0 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20 20  ", zAff);.      
19eb0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
19ec0 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
19ed0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
19ee0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19ef0 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
19f00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19f20 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
19f30 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
19f40 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
19f50 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
19f60 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
19f70 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45      zBinOp = "LE
19f80 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
19f90 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
19fa0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22     zBinOp = "GT"
19fb0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19fc0 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
19fd0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b    zBinOp = "GE";
19fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19ff0 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
1a000 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20   zBinOp = "NE"; 
1a010 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a020 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
1a030 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20  zBinOp = "EQ";  
1a040 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a050 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
1a060 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20  BinOp = "IS";   
1a070 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a080 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42  e TK_ISNOT:   zB
1a090 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20  inOp = "ISNOT"; 
1a0a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a0b0 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69   TK_AND:     zBi
1a0c0 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  nOp = "AND";    
1a0d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a0e0 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e  TK_OR:      zBin
1a0f0 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62  Op = "OR";     b
1a100 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a110 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f  K_PLUS:    zBinO
1a120 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72  p = "ADD";    br
1a130 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a140 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70  _STAR:    zBinOp
1a150 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65   = "MUL";    bre
1a160 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a170 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20  MINUS:   zBinOp 
1a180 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65 61  = "SUB";    brea
1a190 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
1a1a0 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  EM:     zBinOp =
1a1b0 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b   "REM";    break
1a1c0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1a1d0 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  TAND:  zBinOp = 
1a1e0 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b  "BITAND"; break;
1a1f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1a200 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  OR:   zBinOp = "
1a210 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a  BITOR";  break;.
1a220 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
1a230 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44  H:   zBinOp = "D
1a240 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IV";    break;. 
1a250 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1a260 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53  T:  zBinOp = "LS
1a270 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
1a280 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
1a290 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48  :  zBinOp = "RSH
1a2a0 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IFT"; break;.   
1a2b0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1a2c0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43    zBinOp = "CONC
1a2d0 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  AT"; break;..   
1a2e0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
1a2f0 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e    zUniOp = "UMIN
1a300 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  US"; break;.    
1a310 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20  case TK_UPLUS:  
1a320 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53   zUniOp = "UPLUS
1a330 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
1a340 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20  ase TK_BITNOT:  
1a350 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54  zUniOp = "BITNOT
1a360 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1a370 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a  se TK_NOT:     z
1a380 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20  UniOp = "NOT";  
1a390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a3a0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55  e TK_ISNULL:  zU
1a3b0 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b  niOp = "ISNULL";
1a3c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a3d0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e   TK_NOTNULL: zUn
1a3e0 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b  iOp = "NOTNULL";
1a3f0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1a400 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
1a410 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
1a420 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
1a430 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1a440 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1a450 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1a460 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1a470 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1a480 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1a490 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
1a4a0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1a4b0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1a4c0 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1a4d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1a4e0 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1a4f0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1a500 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41      if( op==TK_A
1a510 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  GG_FUNCTION ){. 
1a520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a530 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a540 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25  , "AGG_FUNCTION%
1a550 64 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20 20  d:%s(",.        
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c       pExpr->op2,
1a580 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1a590 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1a5a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a5b0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a5c0 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28  t, "FUNCTION:%s(
1a5d0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1a5e0 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
1a5f0 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
1a600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a610 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1a620 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20 20  Out, pFarg);.   
1a630 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1a640 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a650 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1a660 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1a670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a680 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1a690 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20  case TK_EXISTS: 
1a6a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1a6b0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a6c0 74 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a 20  t, "EXISTS(");. 
1a6d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a6e0 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1a6f0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1a700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a710 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a720 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 62  ut,")");.      b
1a730 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a740 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
1a750 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1a760 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a770 74 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20 73  t, "(");.      s
1a780 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
1a790 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ect(pOut, pExpr-
1a7a0 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
1a7b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a7c0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1a7d0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1a7e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a7f0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TK_IN: {.      s
1a800 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a810 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22 29  ntf(pOut, "IN(")
1a820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a830 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1a840 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1a850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a860 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a870 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66 28   ",");.      if(
1a880 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1a890 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1a8a0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1a8b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
1a8c0 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70  elect(pOut, pExp
1a8d0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
1a8e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a8f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a900 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c  inExprList(pOut,
1a910 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1a920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a930 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1a940 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1a950 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a960 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1a970 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a980 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
1a990 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
1a9a0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
1a9b0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
1a9c0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
1a9d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1a9e0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
1a9f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
1aa00 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1aa10 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1aa20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1aa30 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
1aa40 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
1aa50 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1aa60 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
1aa70 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
1aa80 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1aa90 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
1aaa0 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
1aab0 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
1aac0 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
1aad0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1aae0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
1aaf0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1ab00 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1ab10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ab20 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1ab30 22 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20 20  "BETWEEN(");.   
1ab40 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ab50 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29 3b  nExpr(pOut, pX);
1ab60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ab70 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1ab80 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71  , ",");.      sq
1ab90 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1aba0 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20 20  (pOut, pY);.    
1abb0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1abc0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1abd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1abe0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1abf0 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pZ);.      sql
1ac00 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ac10 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1ac20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ac30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
1ac40 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
1ac50 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
1ac60 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
1ac70 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
1ac80 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
1ac90 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
1aca0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
1acb0 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
1acc0 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
1acd0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
1ace0 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
1acf0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
1ad00 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
1ad10 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
1ad20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
1ad30 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
1ad40 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
1ad50 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
1ad60 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
1ad70 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
1ad80 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
1ad90 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
1ada0 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
1adb0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
1adc0 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
1add0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1ade0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1adf0 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25 64  ntf(pOut, "%s(%d
1ae00 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
1ae10 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
1ae20 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45  NEW" : "OLD", pE
1ae30 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1ae40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ae50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
1ae60 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1ae70 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ae80 28 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29 3b  (pOut, "CASE(");
1ae90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1aea0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1aeb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1aec0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1aed0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1aee0 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1aef0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1af00 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  st(pOut, pExpr->
1af10 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1af20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1af30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1af40 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
1af50 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
1af60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1af70 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20  zType = "unk";. 
1af80 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78       switch( pEx
1af90 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a  pr->affinity ){.
1afa0 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1afb0 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70  Rollback:   zTyp
1afc0 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20  e = "rollback"; 
1afd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1afe0 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20  case OE_Abort:  
1aff0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f      zType = "abo
1b000 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  rt";     break;.
1b010 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1b020 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70  Fail:       zTyp
1b030 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20  e = "fail";     
1b040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b050 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
1b060 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e      zType = "ign
1b070 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ore";    break;.
1b080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1b090 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b0a0 74 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45 2d  tf(pOut, "RAISE-
1b0b0 25 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c 20  %s(%s)", zType, 
1b0c0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1b0d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b0e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1b0f0 20 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a    if( zBinOp ){.
1b100 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b110 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1b120 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20  s(", zBinOp);.  
1b130 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b140 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b150 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1b160 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b170 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20  tf(pOut,",");.  
1b180 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b190 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b1a0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  ->pRight);.    s
1b1b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b1c0 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20  ntf(pOut,")");. 
1b1d0 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f   }else if( zUniO
1b1e0 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
1b1f0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b200 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70  ut,"%s(", zUniOp
1b210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b220 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1b230 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1b240 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b250 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1b260 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
1b270 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1b280 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1b290 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64  PLAIN) */..#if d
1b2a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1b2b0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
1b2c0 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
1b2d0 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
1b2e0 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
1b2f0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1b300 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
1b310 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b320 4c 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c  List(Vdbe *pOut,
1b330 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1b340 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1b350 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
1b360 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b  ist->nExpr==0 ){
1b370 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b380 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1b390 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b  "(empty-list)");
1b3a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1b3b0 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e  else if( pList->
1b3c0 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
1b3d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1b3e0 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e  pr(pOut, pList->
1b3f0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[0].pExpr);.  }
1b400 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1b410 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75  3ExplainPush(pOu
1b420 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
1b430 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1b440 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1b450 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b460 66 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64  f(pOut, "item[%d
1b470 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20  ] = ", i);.     
1b480 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b490 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  ush(pOut);.     
1b4a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b4b0 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d  xpr(pOut, pList-
1b4c0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1b4d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b4e0 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20  inPop(pOut);.   
1b4f0 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e     if( i<pList->
1b500 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
1b510 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b520 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  nNL(pOut);.     
1b530 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1b540 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
1b550 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Out);.  }.}.#end
1b560 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1b570 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
1b580 75 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70  urn TRUE if pExp
1b590 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74  r is an constant
1b5a0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1b5b0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a   is appropriate.
1b5c0 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67  ** for factoring
1b5d0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20   out of a loop. 
1b5e0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70   Appropriate exp
1b5f0 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a  ressions are:.**
1b600 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78  .**    *  Any ex
1b610 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76  pression that ev
1b620 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f  aluates to two o
1b630 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a  r more opcodes..
1b640 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
1b650 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52  OP_Integer, OP_R
1b660 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  eal, OP_String, 
1b670 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c  OP_Blob, OP_Null
1b680 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f  , .**       or O
1b690 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20  P_Variable that 
1b6a0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1b6b0 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20   be placed in a 
1b6c0 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66  .**       specif
1b6d0 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  ic register..**.
1b6e0 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  ** There is no p
1b6f0 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e  oint in factorin
1b700 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73  g out single-ins
1b710 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e  truction constan
1b720 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  t.** expressions
1b730 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1b740 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72   placed in a par
1b750 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
1b760 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  .  .** We could 
1b770 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c  factor them out,
1b780 20 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75   but then we wou
1b790 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67  ld end up adding
1b7a0 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20   an.** OP_SCopy 
1b7b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d  instruction to m
1b7c0 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ove the value in
1b7d0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
1b7e0 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72  egister.** later
1b7f0 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77  .  We might as w
1b800 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65  ell just use the
1b810 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75   original instru
1b820 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f  ction and.** avo
1b830 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e  id the OP_SCopy.
1b840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1b850 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46  sAppropriateForF
1b860 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70  actoring(Expr *p
1b870 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  ){.  if( !sqlite
1b880 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
1b890 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20  otJoin(p) ){.   
1b8a0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f   return 0;  /* O
1b8b0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  nly constant exp
1b8c0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70  ressions are app
1b8d0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63  ropriate for fac
1b8e0 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  toring */.  }.  
1b8f0 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
1b900 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30  EP_FixedDest)==0
1b910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1b920 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61  ;  /* Any consta
1b930 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78  nt without a fix
1b940 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  ed destination i
1b950 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
1b960 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
1b970 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20  >op==TK_UPLUS ) 
1b980 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1b990 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
1b9a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b9b0 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1b9c0 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1b9d0 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  OB:.#endif.    c
1b9e0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1b9f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1ba00 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
1ba10 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
1ba20 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63  e TK_NULL:.    c
1ba30 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1ba40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ba50 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20   p->op==TK_BLOB 
1ba60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ba70 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  e( p->op==TK_VAR
1ba80 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  IABLE );.      t
1ba90 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
1baa0 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  TK_INTEGER );.  
1bab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
1bac0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b  >op==TK_FLOAT );
1bad0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bae0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20   p->op==TK_NULL 
1baf0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bb00 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  e( p->op==TK_STR
1bb10 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  ING );.      /* 
1bb20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69  Single-instructi
1bb30 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74  on constants wit
1bb40 68 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  h a fixed destin
1bb50 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20  ation are.      
1bb60 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69  ** better done i
1bb70 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66  n-line.  If we f
1bb80 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79  actor them, they
1bb90 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20   will just end. 
1bba0 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72       ** up gener
1bbb0 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70  ating an OP_SCop
1bbc0 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61  y to move the va
1bbd0 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69  lue to the desti
1bbe0 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
1bbf0 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20  register. */.   
1bc00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1bc10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1bc20 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
1bc30 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  f( p->pLeft->op=
1bc40 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e  =TK_FLOAT || p->
1bc50 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1bc60 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1bc70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1bc80 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1bc90 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1bca0 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  t: {.      break
1bcb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1bcc0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1bcd0 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
1bce0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
1bcf0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
1bd00 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61  priate for.** fa
1bd10 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
1bd20 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c   loop, then eval
1bd30 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
1bd40 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  ion.** into a re
1bd50 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65  gister and conve
1bd60 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rt the expressio
1bd70 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49  n into a TK_REGI
1bd80 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69  STER.** expressi
1bd90 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1bda0 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28  t evalConstExpr(
1bdb0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1bdc0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1bdd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
1bde0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
1bdf0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
1be00 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
1be10 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73  e TK_IN:.    cas
1be20 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1be30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1be40 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1be50 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1be60 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
1be70 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
1be80 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
1be90 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f  _FUNC: {.      /
1bea0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * The arguments 
1beb0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  to a function ha
1bec0 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ve a fixed desti
1bed0 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  nation..      **
1bee0 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20   Mark them this 
1bef0 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e  way to avoid gen
1bf00 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20  erated unneeded 
1bf10 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a  OP_SCopy.      *
1bf20 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  * instructions. 
1bf30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1bf40 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1bf50 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1bf60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bf70 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1bf80 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1bf90 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
1bfa0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1bfb0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
1bfc0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1bfd0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1bfe0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1bff0 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
1c000 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d    for(; i>0; i--
1c010 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c020 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1c030 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29  (pItem->pExpr) )
1c040 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66   pItem->pExpr->f
1c050 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64  lags |= EP_Fixed
1c060 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dest;.        }.
1c070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1c080 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1c090 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61   if( isAppropria
1c0a0 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70  teForFactoring(p
1c0b0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
1c0c0 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r1 = ++pParse->
1c0d0 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32  nMem;.    int r2
1c0e0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
1c0f0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1c100 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c110 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  r1);.    if( NEV
1c120 45 52 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c  ER(r1!=r2) ) sql
1c130 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c140 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
1c150 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
1c160 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
1c170 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
1c180 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78  EGISTER;.    pEx
1c190 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b  pr->iTable = r2;
1c1a0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1c1b0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
1c1c0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c1d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76  ;.}../*.** Preev
1c1e0 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20  aluate constant 
1c1f0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
1c200 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20  ithin pExpr and 
1c210 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
1c220 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1c230 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72  s.  Modify pExpr
1c240 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
1c250 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69  stant subexpresi
1c260 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45  ons.** are TK_RE
1c270 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74  GISTER opcodes t
1c280 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1c290 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c   precomputed val
1c2a0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
1c2b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1c2c0 6f 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74  op if the jump t
1c2d0 6f 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65  o the cookie-che
1c2e0 63 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61  ck code has.** a
1c2f0 6c 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53  lready occur.  S
1c300 69 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d  ince the cookie-
1c310 63 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65  check jump is ge
1c320 6e 65 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f  nerated prior to
1c330 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65  .** any other se
1c340 72 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67  rious processing
1c350 2c 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73  , this check ens
1c360 75 72 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ures that there 
1c370 69 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20  is no.** way to 
1c380 61 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73  accidently bypas
1c390 73 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69  s the constant i
1c3a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a  nitializations..
1c3b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c3c0 6e 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d  ne is also a no-
1c3d0 6f 70 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  op if the SQLITE
1c3e0 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20  _FactorOutConst 
1c3f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
1c400 69 73 20 64 69 73 61 62 6c 65 64 20 76 69 61 20  is disabled via 
1c410 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74  the sqlite3_test
1c420 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c430 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1c440 41 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72  ATIONS).** inter
1c450 66 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f  face.  This allo
1c460 77 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f  ws test logic to
1c470 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1c480 20 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a   same answer is.
1c490 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20  ** obtained for 
1c4a0 71 75 65 72 69 65 73 20 72 65 67 61 72 64 6c 65  queries regardle
1c4b0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
1c4c0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61   not constants a
1c4d0 72 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65  re.** precompute
1c4e0 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73  d into registers
1c4f0 20 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20   or if they are 
1c500 69 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65  inserted in-line
1c510 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c520 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e  3ExprCodeConstan
1c530 74 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts(Parse *pParse
1c540 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1c550 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66    Walker w;.  if
1c560 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
1c570 47 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Goto ) return;. 
1c580 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
1c590 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1c5a0 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
1c5b0 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  !=0 ) return;.  
1c5c0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
1c5d0 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b  = evalConstExpr;
1c5e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
1c5f0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50  back = 0;.  w.pP
1c600 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1c610 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
1c620 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
1c630 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c640 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
1c650 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
1c660 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
1c670 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1c680 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
1c690 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1c6a0 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
1c6b0 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
1c6c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1c6d0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1c6e0 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
1c6f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1c700 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
1c710 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c720 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1c730 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
1c740 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
1c750 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
1c760 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
1c770 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
1c780 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1c790 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
1c7a0 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72  s */.  int doHar
1c7b0 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b  dCopy     /* Mak
1c7c0 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66  e a hard copy of
1c7d0 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a   every element *
1c7e0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
1c7f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c800 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  em;.  int i, n;.
1c810 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
1c820 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c830 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
1c840 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
1c850 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
1c860 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
1c870 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
1c880 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
1c890 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  r;.  for(pItem=p
1c8a0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1c8b0 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
1c8c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
1c8d0 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
1c8e0 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20  ;.    int inReg 
1c8f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c900 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1c910 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
1c920 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
1c930 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
1c940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c950 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
1c960 62 65 2c 20 64 6f 48 61 72 64 43 6f 70 79 20 3f  be, doHardCopy ?
1c970 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
1c980 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  opy,.           
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 52               inR
1c9a0 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
1c9b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c9c0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
1c9d0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1c9e0 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  a BETWEEN operat
1c9f0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42  or..**.**    x B
1ca00 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a  ETWEEN y AND z.*
1ca10 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
1ca20 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1ca30 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41  .**.**    x>=y A
1ca40 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f  ND x<=z.**.** Co
1ca50 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
1ca60 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
1ca70 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
1ca80 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65  xpression.** ele
1ca90 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  mentation of x..
1caa0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1cab0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
1cac0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1cad0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1cae0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1caf0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1cb00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1cb10 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
1cb20 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1cb30 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
1cb40 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1cb50 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  if the jump is t
1cb60 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  aken */.  int ju
1cb70 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54  mpIfTrue,   /* T
1cb80 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1cb90 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74  the BETWEEN is t
1cba0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  rue */.  int jum
1cbb0 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
1cbc0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1cbd0 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
1cbe0 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  LL */.){.  Expr 
1cbf0 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20  exprAnd;     /* 
1cc00 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
1cc10 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c   in  x>=y AND x<
1cc20 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  =z  */.  Expr co
1cc30 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68  mpLeft;    /* Th
1cc40 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f  e  x>=y  term */
1cc50 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68  .  Expr compRigh
1cc60 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d  t;   /* The  x<=
1cc70 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  z  term */.  Exp
1cc80 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f  r exprX;       /
1cc90 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70  * The  x  subexp
1cca0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1ccb0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f   regFree1 = 0; /
1ccc0 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
1ccd0 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61  register */..  a
1cce0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ccf0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1cd00 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1cd10 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
1cd20 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
1cd30 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
1cd40 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
1cd50 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
1cd60 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
1cd70 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
1cd80 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
1cd90 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
1cda0 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
1cdb0 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
1cdc0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1cdd0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1cde0 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
1cdf0 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
1ce00 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1ce10 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
1ce20 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1ce30 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1ce40 72 3b 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c  r;.  exprX.iTabl
1ce50 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
1ce60 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ce70 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
1ce80 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d  1);.  exprX.op =
1ce90 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
1cea0 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29  if( jumpIfTrue )
1ceb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1cec0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1ced0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1cee0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1cef0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1cf00 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1cf10 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1cf20 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1cf30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
1cf40 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1cf50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1cf60 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
1cf70 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
1cf80 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
1cf90 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1cfa0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1cfb0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1cfc0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1cfd0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1cfe0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1cff0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1d000 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d010 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1d020 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1d030 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1d040 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d050 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1d060 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1d070 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1d080 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d090 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1d0a0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1d0b0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d0c0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1d0d0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d0e0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1d0f0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d100 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1d110 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1d120 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1d130 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d140 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1d150 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1d160 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1d170 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1d180 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1d190 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1d1a0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1d1b0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1d1c0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1d1d0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1d1e0 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
1d1f0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1d200 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1d210 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1d220 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
1d230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1d240 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1d250 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1d260 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1d270 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
1d280 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1d290 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
1d2a0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1d2b0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
1d2c0 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
1d2d0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
1d2e0 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
1d2f0 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
1d300 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
1d310 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
1d320 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
1d330 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
1d340 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1d350 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
1d360 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
1d370 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
1d380 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
1d390 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
1d3a0 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
1d3b0 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
1d3c0 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
1d3d0 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
1d3e0 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
1d3f0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
1d400 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
1d410 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
1d420 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1d430 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1d440 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1d450 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1d460 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1d470 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1d480 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1d490 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1d4a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1d4b0 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1d4c0 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1d4d0 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1d4e0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1d4f0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1d500 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1d510 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
1d520 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e  urn;  /* Existan
1d530 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1d540 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1d550 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
1d560 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
1d570 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
1d580 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
1d590 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1d5a0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1d5b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1d5c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1d5d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1d5e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1d5f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d600 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1d610 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d620 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1d630 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d640 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1d650 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1d660 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
1d670 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1d680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d690 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1d6a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1d6b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1d6c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d6d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1d6e0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1d6f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1d700 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
1d710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d720 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
1d730 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1d740 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1d750 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1d760 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1d770 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1d780 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1d790 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1d7a0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1d7b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1d7c0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1d7d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1d7e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d7f0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1d800 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1d810 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1d820 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d830 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1d840 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1d850 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d860 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d870 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d880 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1d890 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1d8a0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1d8b0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1d8c0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1d8d0 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
1d8e0 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
1d8f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d900 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
1d910 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d920 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
1d930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1d940 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
1d950 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
1d960 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
1d970 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
1d980 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
1d990 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d9a0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
1d9b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45  tcase( op==TK_LE
1d9c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d9d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  se( op==TK_GT );
1d9e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d9f0 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
1da00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1da10 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
1da20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1da30 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
1da40 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1da50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
1da60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1da70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1da80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1da90 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1daa0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1dab0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1dac0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1dad0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1dae0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1daf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1db00 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1db10 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1db20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1db30 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1db40 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
1db50 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1db60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1db70 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1db80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1db90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dba0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1dbb0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
1dbc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1dbd0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1dbe0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1dbf0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1dc00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1dc10 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1dc20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1dc30 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1dc40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dc50 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1dc60 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1dc70 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1dc80 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1dc90 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1dca0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1dcb0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1dcc0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1dcd0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1dcf0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1dd00 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1dd10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1dd20 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1dd30 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1dd40 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1dd50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1dd60 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1dd70 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1dd80 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
1dd90 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
1dda0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
1ddb0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ddc0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1ddd0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
1dde0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1ddf0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
1de00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1de10 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1de20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1de30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1de40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1de50 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1de60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1de70 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
1de80 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
1de90 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1dea0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1deb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1dec0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1ded0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1dee0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1def0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1df00 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1df10 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d  pr, dest, 1, jum
1df20 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1df30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1df40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1df50 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1df60 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1df70 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
1df80 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
1df90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1dfa0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
1dfb0 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f  l = jumpIfNull ?
1dfc0 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61   dest : destIfFa
1dfd0 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse;.      sqlit
1dfe0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1dff0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1e000 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
1e010 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1e020 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e030 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1e040 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1e050 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1e060 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1e070 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e080 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e090 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1e0a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e0b0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e0c0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1e0d0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1e0e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e0f0 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74   OP_If, r1, dest
1e100 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
1e110 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e120 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e130 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e140 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e150 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e160 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1e170 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1e180 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1e190 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
1e1a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1e1b0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20  se, regFree2);  
1e1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1e1d0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
1e1e0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
1e1f0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
1e200 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
1e210 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
1e220 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1e230 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
1e240 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
1e250 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
1e260 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
1e270 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
1e280 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
1e290 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
1e2a0 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
1e2b0 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
1e2c0 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
1e2d0 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
1e2e0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1e2f0 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75  LL or fall throu
1e300 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  gh if jumpIfNull
1e310 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69  .** is 0..*/.voi
1e320 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
1e330 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
1e340 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1e350 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
1e360 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
1e370 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1e380 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
1e390 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1e3a0 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
1e3b0 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
1e3c0 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
1e3d0 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
1e3e0 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
1e3f0 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
1e400 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
1e410 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
1e420 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65  rn; /* Existance
1e430 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
1e440 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
1e450 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20  if( pExpr==0 )  
1e460 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
1e470 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
1e480 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
1e490 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
1e4a0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
1e4b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
1e4c0 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
1e4d0 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
1e4e0 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
1e4f0 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
1e500 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
1e510 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
1e520 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
1e530 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
1e540 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
1e550 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
1e560 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
1e570 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
1e580 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
1e590 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1e5b0 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
1e5c0 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
1e5d0 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
1e5e0 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
1e5f0 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
1e600 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
1e610 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
1e620 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
1e630 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
1e640 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
1e650 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
1e660 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
1e670 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
1e680 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
1e690 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
1e6a0 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
1e6b0 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
1e6c0 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
1e6d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
1e6e0 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
1e6f0 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
1e700 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
1e710 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
1e720 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
1e730 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
1e740 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
1e750 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
1e760 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
1e770 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
1e780 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
1e790 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
1e7a0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
1e7b0 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
1e7c0 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
1e7d0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1e7e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
1e7f0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
1e800 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e810 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
1e820 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
1e830 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1e840 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
1e850 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1e860 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
1e870 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
1e880 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e890 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
1e8a0 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
1e8b0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1e8c0 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
1e8d0 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
1e8e0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
1e8f0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
1e900 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
1e910 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
1e920 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
1e930 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e940 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e960 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1e970 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1e980 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e9a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1e9b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1e9c0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e9d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e9e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e9f0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
1ea00 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
1ea10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ea20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1ea30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1ea40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ea50 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1ea60 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1ea70 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1ea80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ea90 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
1eaa0 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
1eab0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1eac0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1ead0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1eae0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1eaf0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1eb00 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1eb10 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
1eb20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1eb30 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
1eb40 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1eb50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1eb60 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1eb70 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1eb80 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1eb90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1eba0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1ebb0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1ebc0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ebd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ebe0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
1ebf0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
1ec00 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
1ec10 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
1ec20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
1ec30 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
1ec40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ec50 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
1ec60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ec70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
1ec80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ec90 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
1eca0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
1ecb0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1ecc0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
1ecd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ece0 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
1ecf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1ed00 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1ed10 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1ed20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ed30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ed40 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1ed50 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1ed60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ed70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ed80 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1ed90 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1eda0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1edb0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1edc0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
1edf0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1ee00 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ee10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ee20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ee30 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1ee40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ee50 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1ee60 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b  case TK_ISNOT: {
1ee70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ee80 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1ee90 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1eea0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1eeb0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
1eec0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1eed0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1eee0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1eef0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1ef00 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1ef10 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ef20 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1ef30 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1ef40 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72       op = (pExpr
1ef50 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54  ->op==TK_IS) ? T
1ef60 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20  K_NE : TK_EQ;.  
1ef70 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1ef80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ef90 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1efa0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1efb0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1efc0 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f  2, dest, SQLITE_
1efd0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
1efe0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1eff0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1f000 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f010 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f020 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f030 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1f040 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1f050 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  L: {.      testc
1f060 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1f070 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
1f080 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1f090 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1f0a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f0b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f0c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f0d0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1f0e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f0f0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1f100 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f110 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f120 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f130 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f140 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1f150 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1f160 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1f170 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1f180 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1f190 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49  , dest, 0, jumpI
1f1a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1f1b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1f1c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1f1d0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1f1e0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1f1f0 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29  if( jumpIfNull )
1f200 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f210 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1f220 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
1f230 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
1f240 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1f250 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
1f260 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f270 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
1f280 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1f290 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f2a0 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c  dest, destIfNull
1f2b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f2c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f2d0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
1f2e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f2f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1f300 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1f310 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
1f320 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f330 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f340 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f360 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
1f370 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
1f380 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
1f390 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f3a0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f3b0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1f3c0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1f3d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f3e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1f3f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1f400 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
1f410 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1f420 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1f430 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
1f440 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
1f450 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
1f460 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
1f470 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
1f480 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
1f490 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
1f4a0 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
1f4b0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
1f4c0 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
1f4d0 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
1f4e0 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
1f4f0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
1f500 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
1f510 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
1f520 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
1f530 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
1f540 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53  perator..**.** S
1f550 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
1f560 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1f570 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
1f580 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
1f590 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
1f5a0 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
1f5b0 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
1f5c0 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
1f5d0 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
1f5e0 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
1f5f0 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
1f600 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
1f610 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
1f620 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
1f630 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
1f640 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
1f650 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
1f660 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1f670 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
1f680 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
1f690 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
1f6a0 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
1f6b0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1f6c0 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
1f6d0 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
1f6e0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1f6f0 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
1f700 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
1f710 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
1f720 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
1f730 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
1f740 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
1f750 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
1f760 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
1f770 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
1f780 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
1f790 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1f7a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1f7b0 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
1f7c0 72 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41  r *pB){.  if( pA
1f7d0 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
1f7e0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
1f7f0 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61  ? 0 : 2;.  }.  a
1f800 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1f810 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  nyProperty(pA, E
1f820 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1f830 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73  educed) );.  ass
1f840 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1f850 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1f860 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1f870 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45  uced) );.  if( E
1f880 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f890 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  A, EP_xIsSelect)
1f8a0 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
1f8b0 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65  rty(pB, EP_xIsSe
1f8c0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
1f8d0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
1f8e0 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1f8f0 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
1f900 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
1f910 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32  inct) ) return 2
1f920 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  ;.  if( pA->op!=
1f930 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
1f940 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  2;.  if( sqlite3
1f950 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1f960 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
1f970 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1f980 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1f990 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
1f9a0 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
1f9b0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1f9c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1f9d0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
1f9e0 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
1f9f0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1fa00 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
1fa10 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
1fa20 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
1fa30 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
1fa40 32 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  2;.  if( ExprHas
1fa50 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1fa60 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  IntValue) ){.   
1fa70 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
1fa80 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74  perty(pB, EP_Int
1fa90 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e  Value) || pA->u.
1faa0 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56  iValue!=pB->u.iV
1fab0 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
1fac0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1fad0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70  }else if( pA->op
1fae0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  !=TK_COLUMN && A
1faf0 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b  LWAYS(pA->op!=TK
1fb00 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
1fb10 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 7b 0a 20  pA->u.zToken){. 
1fb20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1fb30 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e  operty(pB, EP_In
1fb40 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52  tValue) || NEVER
1fb50 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30  (pB->u.zToken==0
1fb60 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1fb70 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d    if( strcmp(pA-
1fb80 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
1fb90 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
1fba0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
1fbb0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
1fbc0 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  A->flags & EP_Ex
1fbd0 70 43 6f 6c 6c 61 74 65 29 21 3d 28 70 42 2d 3e  pCollate)!=(pB->
1fbe0 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1fbf0 6c 6c 61 74 65 29 20 29 20 72 65 74 75 72 6e 20  llate) ) return 
1fc00 31 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  1;.  if( (pA->fl
1fc10 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1fc20 61 74 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 70  ate)!=0 && pA->p
1fc30 43 6f 6c 6c 21 3d 70 42 2d 3e 70 43 6f 6c 6c 20  Coll!=pB->pColl 
1fc40 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 72 65  ) return 2;.  re
1fc50 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1fc60 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
1fc70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
1fc80 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
1fc90 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
1fca0 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
1fcb0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
1fcc0 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
1fcd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
1fce0 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
1fcf0 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
1fd00 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
1fd10 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
1fd20 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
1fd30 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
1fd40 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
1fd50 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
1fd60 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
1fd70 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
1fd80 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
1fd90 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
1fda0 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
1fdb0 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
1fdc0 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
1fdd0 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
1fde0 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
1fdf0 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
1fe00 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
1fe10 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
1fe20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
1fe30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fe40 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
1fe50 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
1fe60 70 72 4c 69 73 74 20 2a 70 42 29 7b 0a 20 20 69  prList *pB){.  i
1fe70 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
1fe80 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
1fe90 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
1fea0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
1feb0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
1fec0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
1fed0 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
1fee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
1fef0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1ff00 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
1ff10 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
1ff20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
1ff30 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
1ff40 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
1ff50 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
1ff60 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
1ff70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
1ff80 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1ff90 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
1ffa0 20 70 45 78 70 72 42 29 20 29 20 72 65 74 75 72   pExprB) ) retur
1ffb0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
1ffc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
1ffd0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1ffe0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1fff0 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
20000 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
20010 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
20020 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
20030 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
20040 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
20050 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
20060 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
20070 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
20080 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
20090 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
200a0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
200b0 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
200c0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
200d0 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
200e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
200f0 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
20100 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
20110 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20120 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
20130 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
20140 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
20150 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
20160 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
20170 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
20180 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
20190 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
201a0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
201b0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
201c0 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
201d0 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
201e0 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
201f0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
20200 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
20210 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
20220 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
20230 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
20240 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
20250 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
20260 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
20270 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
20280 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
20290 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
202a0 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
202b0 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
202c0 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
202d0 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
202e0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
202f0 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
20300 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
20310 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
20320 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
20330 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
20340 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
20350 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
20360 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
20370 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
20380 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
20390 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
203a0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
203b0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
203c0 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
203d0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
203e0 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
203f0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
20400 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
20410 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
20420 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
20430 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
20440 0a 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d  .    if( i<pSrc-
20450 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  >nSrc ){.      p
20460 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
20470 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
20480 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Other++;.    }. 
20490 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
204a0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
204b0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
204c0 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  any of the argum
204d0 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70  ents to the pExp
204e0 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72  r Function refer
204f0 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74  ence.** pSrcList
20500 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
20510 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f  f they do.  Also
20520 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
20530 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  the function.** 
20540 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  has no arguments
20550 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e   or has only con
20560 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
20570 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
20580 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72  f pExpr.** refer
20590 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75  ences columns bu
205a0 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  t not columns of
205b0 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e   tables found in
205c0 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e   pSrcList..*/.in
205d0 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  t sqlite3Functio
205e0 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70  nUsesThisSrc(Exp
205f0 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73  r *pExpr, SrcLis
20600 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20  t *pSrcList){.  
20610 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
20620 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b  ct SrcCount cnt;
20630 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
20640 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
20650 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65  CTION );.  memse
20660 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
20670 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
20680 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
20690 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72  Count;.  w.u.pSr
206a0 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
206b0 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
206c0 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
206d0 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
206e0 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
206f0 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
20700 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
20710 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
20720 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
20730 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
20740 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
20750 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
20760 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
20770 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
20780 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
20790 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
207a0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
207b0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
207c0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
207d0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
207e0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
207f0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
20800 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
20810 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
20820 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
20830 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
20840 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
20850 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
20860 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
20870 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
20880 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
20890 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
208a0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
208b0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
208c0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
208d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
208e0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
208f0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
20900 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
20910 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
20920 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
20930 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
20940 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
20950 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
20960 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
20970 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
20980 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
20990 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
209a0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
209b0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
209c0 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
209d0 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
209e0 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
209f0 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
20a00 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
20a10 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
20a20 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
20a30 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
20a40 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
20a50 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
20a60 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
20a70 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
20a80 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
20a90 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20aa0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
20ab0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
20ac0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
20ad0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
20ae0 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
20af0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
20b00 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
20b10 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
20b20 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
20b30 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
20b40 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
20b50 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
20b60 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
20b70 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
20b80 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
20b90 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
20ba0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
20bb0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
20bc0 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
20bd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
20be0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
20bf0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
20c00 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
20c10 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
20c20 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
20c30 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
20c40 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
20c50 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
20c60 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
20c70 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
20c80 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
20c90 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
20ca0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
20cb0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
20cc0 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
20cd0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
20ce0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
20cf0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
20d00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
20d10 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
20d20 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
20d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
20d40 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
20d50 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
20d60 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
20d70 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
20d80 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
20d90 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
20da0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
20db0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
20dc0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
20dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
20de0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
20df0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
20e00 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
20e10 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
20e20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
20e30 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
20e40 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
20e50 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
20e60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
20e70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
20e80 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
20e90 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
20ea0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
20eb0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
20ec0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
20ed0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
20ee0 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
20ef0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
20f00 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
20f10 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
20f20 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
20f30 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
20f40 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
20f50 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
20f60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20f70 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
20f80 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
20f90 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
20fa0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
20fb0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
20fc0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
20fd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20ff0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21000 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
21010 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
21020 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
21030 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
21040 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
21050 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
21060 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
21070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21080 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
21090 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
210a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
210b0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
210c0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
210d0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
210e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
21100 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
21110 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
21120 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21130 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
21140 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
21150 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
21160 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
21170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21180 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
21190 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
211a0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
211b0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
211c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
211d0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
211e0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
211f0 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
21200 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
21210 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
21220 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
21230 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21250 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
21280 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
212a0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
212b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
212c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
212d0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
212e0 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
212f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21310 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
21320 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
21330 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
21340 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
21350 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
21360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
213a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
213b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
213c0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
213d0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
213f0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
21400 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
21410 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
21430 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21450 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
21460 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
21470 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
21480 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
21490 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
214a0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
214b0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
214c0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
214d0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
214e0 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
214f0 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
21500 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
21510 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
21520 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
21530 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
21540 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
21550 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
21560 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
21570 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
21580 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
21590 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
215a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
215b0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
215c0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
215d0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
215e0 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
215f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21600 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
21610 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
21620 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
21630 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
21640 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
21650 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
21660 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
21670 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
21680 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
21690 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
216a0 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
216b0 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
216c0 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
216d0 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
216e0 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
216f0 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
21700 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
21710 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
21720 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
21730 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
21740 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
21750 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
21760 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
21770 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
21780 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21790 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
217a0 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
217b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
217c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
217d0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
217e0 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
217f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
21800 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
21810 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
21820 72 2c 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a  r, pExpr)==0 ){.
21830 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
21840 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
21850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21860 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
21870 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
21880 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
21890 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
218a0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
218b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
218c0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
218d0 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
218e0 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
218f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
21900 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
21910 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
21920 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
21930 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
21940 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21950 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21960 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
21970 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
21980 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
21990 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
219a0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
219b0 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
219c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
219d0 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
219e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
219f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
21a00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
21a10 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
21a20 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
21a30 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
21a40 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
21a50 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
21a60 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
21a70 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21a80 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65  u.zToken, sqlite
21a90 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
21aa0 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21ac0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
21ad0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
21ae0 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
21af0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21b00 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
21b10 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
21b20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21b30 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
21b40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
21b50 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
21b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21b70 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
21b80 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
21b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21bb0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
21bc0 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
21bd0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
21be0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
21bf0 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
21c00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21c10 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
21c20 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
21c30 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
21c40 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
21c50 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
21c60 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
21c70 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
21c80 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
21c90 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
21ca0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
21cb0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
21cc0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
21cd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21ce0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
21cf0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
21d00 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
21d10 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
21d20 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
21d30 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
21d40 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b  _PARAMETER(pWalk
21d50 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  er);.  UNUSED_PA
21d60 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
21d70 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
21d80 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
21d90 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
21da0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
21db0 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
21dc0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
21dd0 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
21de0 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
21df0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
21e00 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
21e10 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
21e20 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
21e30 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
21e40 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
21e50 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
21e60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
21e70 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
21e80 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
21e90 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
21ea0 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
21eb0 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
21ec0 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
21ed0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
21ee0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
21ef0 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
21f00 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
21f10 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
21f20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
21f30 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
21f40 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
21f50 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
21f60 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
21f70 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
21f80 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
21f90 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
21fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
21fb0 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
21fc0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
21fd0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
21fe0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
21ff0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
22000 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
22010 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
22020 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
22030 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
22040 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
22050 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
22060 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
22070 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
22080 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
22090 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
220a0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
220b0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
220c0 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
220d0 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
220e0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
220f0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
22100 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
22110 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
22120 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
22130 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
22140 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
22150 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
22160 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
22170 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
22180 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
22190 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
221a0 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
221b0 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
221c0 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
221d0 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
221e0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
221f0 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
22200 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
22210 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
22220 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
22230 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
22240 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
22250 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
22260 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
22270 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
22280 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
22290 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
222a0 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
222b0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
222c0 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
222d0 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
222e0 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
222f0 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
22300 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
22310 65 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  e dallocation is
22320 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
22330 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
22340 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
22350 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
22360 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
22370 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
22380 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
22390 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
223a0 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
223b0 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
223c0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
223d0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
223e0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
223f0 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
22400 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
22410 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
22420 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
22430 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
22440 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
22450 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
22460 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
22470 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
22480 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
22490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
224a0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
224b0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
224c0 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
224d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
224e0 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
224f0 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
22500 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
22510 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
22520 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
22530 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22540 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
22550 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
22560 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
22570 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
22580 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
22590 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
225a0 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
225b0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
225c0 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
225d0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
225e0 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
225f0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
22600 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
22610 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
22620 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
22630 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
22640 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
22650 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
22660 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22670 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
22680 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
22690 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c  int nReg){.  sql
226a0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
226b0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
226c0 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
226d0 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
226e0 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
226f0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
22700 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
22710 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
22720 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
22730 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
22740 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
22750 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
22760 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
22770 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
22780 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
22790 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
227a0 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
227b0 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
227c0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
227d0 0a 7d 0a                                         .}.