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

Artifact 0525659674b59a642a1a185490ed228cc131fd28:


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 41 4c 57 41 59 53 28 70 29 20 29 7b 0a  e( ALWAYS(p) ){.
0c10: 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
0c20: 70 43 6f 6c 6c 20 3d 20 70 2d 3e 70 43 6f 6c 6c  pColl = p->pColl
0c30: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
0c40: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 70 20  ) break;.    op 
0c50: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
0c60: 20 70 2d 3e 70 54 61 62 21 3d 30 20 26 26 20 28   p->pTab!=0 && (
0c70: 0a 20 20 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f  .        op==TK_
0c80: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
0c90: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  ==TK_COLUMN || o
0ca0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c  p==TK_REGISTER |
0cb0: 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52  | op==TK_TRIGGER
0cc0: 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f  .    )){.      /
0cd0: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
0ce0: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
0cf0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
0d00: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
0d10: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
0d20: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
0d30: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
0d40: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
0d50: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
0d60: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
0d70: 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69   *zColl;.      i
0d80: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
0d90: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
0da0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
0db0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
0dc0: 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 7a  e->db;.        z
0dd0: 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e  Coll = p->pTab->
0de0: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
0df0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
0e00: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
0e10: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
0e20: 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Coll, 0);.      
0e30: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
0e40: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a   pColl;.      }.
0e50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0e60: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54   }.    if( op!=T
0e70: 4b 5f 43 41 53 54 20 26 26 20 6f 70 21 3d 54 4b  K_CAST && op!=TK
0e80: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
0e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0ea0: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
0eb0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
0ec0: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
0ed0: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
0ee0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
0ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
0f00: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  l;.}../*.** pExp
0f10: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
0f20: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
0f30: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
0f40: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
0f50: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
0f60: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
0f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
0f80: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
0f90: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
0fa0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
0fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
0fc0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
0fd0: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
0fe0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
0ff0: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1000: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1010: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1020: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1030: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
1040: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
1050: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
1060: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
1070: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
1080: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
1090: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
10a0: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
10b0: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
10c0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
10d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
10e0: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
10f0: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1100: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1110: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1120: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1150: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  FF_NONE;.    }. 
1160: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
1170: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
1180: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
1190: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
11a0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
11b0: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
11c0: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
11d0: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
11e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
11f0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  FF_NONE;.  }else
1200: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1210: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1220: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1230: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
1240: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
1250: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
1260: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
1270: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1280: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
1290: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
12a0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
12b0: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
12c0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
12d0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
12e0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
12f0: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
1300: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
1310: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
1320: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
1330: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
1340: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
1350: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
1360: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
1370: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
1380: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
1390: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
13a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
13b0: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
13c0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
13d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
13e0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
13f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
1400: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1410: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
1420: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
1430: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1440: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
1450: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1460: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
1470: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
1480: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
1490: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
14a0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
14b0: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
14c0: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
14d0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14e0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14f0: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1500: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1510: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
1520: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
1530: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
1540: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 20   }else if( !aff 
1550: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1560: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1570: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1580: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1590: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
15a0: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
15b0: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
15c0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
15d0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
15e0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
15f0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1600: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1610: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1620: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1630: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1640: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1650: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1660: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1670: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1680: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1690: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
16a0: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
16b0: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
16c0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
16d0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
16e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16f0: 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20  AFF_NONE:.      
1700: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1710: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
1720: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
1730: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
1740: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
1750: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1760: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1770: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1780: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
1790: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
17a0: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
17b0: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
17c0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
17d0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
17e0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
17f0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
1800: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
1810: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
1820: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
1830: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
1840: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
1850: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
1860: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
1870: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
1880: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1890: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
18a0: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
18b0: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
18c0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
18d0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
18e0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
18f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1900: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
1910: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
1920: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1930: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
1940: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1950: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
1960: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
1970: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
1980: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
1990: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
19a0: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
19b0: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
19c0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
19d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
19e0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
19f0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
1a00: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
1a10: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
1a20: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
1a30: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
1a40: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
1a50: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
1a60: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
1a70: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
1a80: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
1a90: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
1aa0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
1ab0: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
1ac0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
1ad0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1ae0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
1af0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
1b00: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
1b10: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
1b20: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
1b30: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
1b40: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
1b50: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1b60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
1b70: 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  eft->pColl );.  
1b80: 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d    pColl = pLeft-
1b90: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20  >pColl;.  }else 
1ba0: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
1bb0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
1bc0: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
1bd0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
1be0: 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t->pColl );.    
1bf0: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
1c00: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pColl;.  }else{.
1c10: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1c20: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1c30: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
1c40: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
1c50: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
1c60: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1c70: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
1c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1c90: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1ca0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cb0: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1cc0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1ce0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1d00: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
1d10: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1d20: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
1d30: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1d40: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1d50: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
1d60: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
1d70: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
1d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
1d90: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
1da0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
1db0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
1dc0: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
1dd0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
1de0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
1df0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
1e00: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
1e10: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
1e20: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
1e30: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
1e40: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
1e50: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
1e60: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
1e70: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
1e80: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
1e90: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1ea0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1eb0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
1ec0: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
1ed0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
1ee0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ef0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1f00: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
1f10: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
1f20: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
1f30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1f50: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
1f60: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
1f70: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
1f80: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
1f90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1fa0: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1fb0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
1fc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
1fd0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67  t argument nHeig
1fe0: 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ht is less than 
1ff0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2000: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65  maximum.** expre
2010: 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f  ssion depth allo
2020: 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  wed. If it is no
2030: 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  t, leave an erro
2040: 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20  r message in.** 
2050: 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  pParse..*/.int s
2060: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
2070: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
2080: 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74  rse, int nHeight
2090: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d  LITE_OK;.  int m
20b0: 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65  xHeight = pParse
20c0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
20d0: 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
20e0: 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65  EPTH];.  if( nHe
20f0: 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b  ight>mxHeight ){
2100: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2110: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
2120: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
2130: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
2140: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
2150: 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74  h %d)", mxHeight
2160: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2170: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2190: 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  }../* The follow
21a0: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
21b0: 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70  ons, heightOfExp
21c0: 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70  r(), heightOfExp
21d0: 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68  rList().** and h
21e0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c  eightOfSelect(),
21f0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
2200: 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d  ermine the maxim
2210: 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20  um height.** of 
2220: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
2230: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  ree referenced b
2240: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
2250: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
2260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
2270: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
2280: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73  aximum height is
2290: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
22a0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
22b0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
22c0: 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73   pnHeight, the s
22d0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
22e0: 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69   then set *pnHei
22f0: 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  ght to that.** v
2300: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2310: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
2320: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
2330: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2340: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2350: 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67  >nHeight>*pnHeig
2360: 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48  ht ){.      *pnH
2370: 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67  eight = p->nHeig
2380: 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
2390: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
23a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70  htOfExprList(Exp
23b0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70  rList *p, int *p
23c0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
23d0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
23e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2400: 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70       heightOfExp
2410: 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  r(p->a[i].pExpr,
2420: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2430: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2440: 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  oid heightOfSele
2450: 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
2460: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
2470: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69  if( p ){.    hei
2480: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
2490: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
24a0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24b0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
24c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24d0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
24e0: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
24f0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2500: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65  p->pOffset, pnHe
2510: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2520: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2530: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
2540: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2550: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
2560: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
2570: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2580: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
2590: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
25a0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
25b0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
25c0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
25d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
25e0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
25f0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
2600: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
2610: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
2620: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
2630: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
2640: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
2650: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
2660: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
2670: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
2680: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
2690: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
26a0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
26b0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
26c0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
26d0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
26e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26f0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
2700: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
2710: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2720: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
2730: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
2740: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2750: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
2760: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
2770: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
2780: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
2790: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
27a0: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
27b0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
27c0: 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  e{.    heightOfE
27d0: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
27e0: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
27f0: 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20   }.  p->nHeight 
2800: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
2810: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2820: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2830: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
2840: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
2850: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
2860: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
2870: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
2880: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
2890: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
28a0: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
28b0: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  or in pParse..*/
28c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
28d0: 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73 65  rSetHeight(Parse
28e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
28f0: 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69  p){.  exprSetHei
2900: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
2910: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2920: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2930: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
2940: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
2950: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2960: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2970: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
2980: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
2990: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
29a0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
29b0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
29c0: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
29d0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
29e0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
29f0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2a00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2a10: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2a20: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65 78  lse.  #define ex
2a30: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
2a40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a50: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2a60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
2a70: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
2a80: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
2a90: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
2aa0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
2ab0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
2ac0: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
2ad0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
2ae0: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
2af0: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
2b00: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
2b10: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
2b20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
2b30: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2b40: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
2b50: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2b60: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
2b70: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2b80: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
2b90: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
2ba0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
2bb0: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
2bc0: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
2bd0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
2be0: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
2bf0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
2c00: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
2c10: 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63 65  g is performance
2c20: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
2c30: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
2c40: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
2c50: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
2c60: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
2c70: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
2c80: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
2c90: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
2ca0: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
2cb0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
2cc0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
2cd0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
2ce0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
2cf0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
2d00: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
2d10: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
2d20: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
2d30: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
2d40: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
2d50: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
2d60: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
2d70: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
2d80: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
2d90: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
2da0: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
2db0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
2dc0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
2dd0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
2de0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
2df0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
2e00: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
2e10: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
2e20: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
2e30: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
2e40: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
2e50: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
2e60: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
2e70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
2e90: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
2ea0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
2eb0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
2ec0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2ee0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
2ef0: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
2f00: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
2f10: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
2f20: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
2f30: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f50: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
2f60: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
2f70: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
2f80: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
2f90: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f   = 0;..  if( pTo
2fa0: 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ken ){.    if( o
2fb0: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
2fc0: 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20   pToken->z==0.  
2fd0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2fe0: 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65  e3GetInt32(pToke
2ff0: 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d  n->z, &iValue)==
3000: 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  0 ){.      nExtr
3010: 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b  a = pToken->n+1;
3020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
3030: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
3040: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3050: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3060: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3070: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
3080: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
3090: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
30a0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
30b0: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
30c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
30d0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
30e0: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
30f0: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
3100: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
3110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
3120: 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70 4e  nt c;.        pN
3130: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
3140: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
3150: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
3160: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  New->u.zToken, p
3170: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
3180: 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ->n);.        pN
3190: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f  ew->u.zToken[pTo
31a0: 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ken->n] = 0;.   
31b0: 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65       if( dequote
31c0: 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20   && nExtra>=3 . 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
31e0: 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  (c = pToken->z[0
31f0: 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27  ])=='\'' || c=='
3200: 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  "' || c=='[' || 
3210: 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20 20  c=='`') ){.     
3220: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
3230: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
3240: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  en);.          i
3250: 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65 77  f( c=='"' ) pNew
3260: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
3270: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
3280: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3290: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
32a0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
32b0: 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d   pNew->nHeight =
32c0: 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d   1;.#endif  .  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
32e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
32f0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
3300: 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a  on node from a z
3310: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74  ero-terminated t
3320: 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a  oken that has.**
3330: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
3340: 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  quoted..*/.Expr 
3350: 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20  *sqlite3Expr(.  
3360: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3370: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
3380: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
3390: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
33a0: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
33b0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
33c0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
33d0: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
33e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f   const char *zTo
33f0: 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ken      /* Toke
3400: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
3410: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
3420: 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e  .  Token x;.  x.
3430: 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e  z = zToken;.  x.
3440: 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c  n = zToken ? sql
3450: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f  ite3Strlen30(zTo
3460: 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  ken) : 0;.  retu
3470: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
3480: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
3490: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
34a0: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
34b0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
34c0: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
34d0: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
34e0: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
34f0: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
3500: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
3510: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
3520: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
3530: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
3540: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
3550: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
3560: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
3570: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
3580: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
3590: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
35a0: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
35b0: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
35c0: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
35d0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
35e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
35f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3600: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
3610: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3620: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
3630: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3640: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
3650: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
3660: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
3670: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 6c    if( pRight->fl
3680: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
3690: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
36a0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
36b0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
36c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f        pRoot->pCo
36d0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
36e0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
36f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
3700: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
3710: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
3720: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
3730: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
3740: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
3750: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
3760: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
3770: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70          pRoot->p
3780: 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43  Coll = pLeft->pC
3790: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
37a0: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
37b0: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
37c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
37d0: 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20 77  te a Expr node w
37e0: 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61  hich joins as ma
37f0: 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65  ny as two subtre
3800: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  es..**.** One or
3810: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62   both of the sub
3820: 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c  trees can be NUL
3830: 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  L.  Return a poi
3840: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
3850: 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f  ** Expr node.  O
3860: 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  r, if an OOM err
3870: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70  or occurs, set p
3880: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
3890: 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65  cFailed,.** free
38a0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e   the subtrees an
38b0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
38c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50  /.Expr *sqlite3P
38d0: 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
38e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
38f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3900: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3930: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
3940: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
3950: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
3960: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
3970: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
3980: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
3990: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
39a0: 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20   *pToken     /* 
39b0: 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a  Argument token *
39c0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  /.){.  Expr *p =
39d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
39e0: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
39f0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3a00: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
3a10: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
3a20: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
3a30: 70 52 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  pRight);.  retur
3a40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  n p;.}../*.** Jo
3a50: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
3a60: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
3a70: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
3a80: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
3a90: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
3aa0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
3ab0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
3ac0: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
3ad0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
3ae0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
3af0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
3b00: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
3b10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3b20: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
3b30: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
3b40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
3b50: 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ft;.  }else{.   
3b60: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
3b70: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
3b80: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
3b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
3ba0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
3bb0: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
3bc0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
3bd0: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
3be0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
3bf0: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
3c00: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
3c10: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
3c20: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
3c30: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
3c40: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
3c50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
3c60: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
3c70: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
3c80: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
3c90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3ca0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
3cb0: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
3cc0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
3cd0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
3ce0: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
3cf0: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
3d00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3d10: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3d20: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
3d30: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
3d40: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
3d50: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
3d60: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
3d70: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
3d80: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
3d90: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
3da0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
3db0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3dc0: 53 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65  SetHeight(pParse
3dd0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
3de0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3df0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
3e00: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
3e10: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
3e20: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
3e30: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
3e40: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
3e50: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
3e60: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
3e70: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
3e80: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
3e90: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
3ea0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
3eb0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
3ec0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
3ed0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
3ee0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
3ef0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
3f00: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
3f10: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
3f20: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
3f30: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
3f40: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
3f50: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
3f60: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
3f70: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
3f80: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
3f90: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
3fa0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
3fb0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3fc0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
3fd0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
3fe0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3ff0: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
4000: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
4010: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
4020: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
4030: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
4040: 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c  equenial variabl
4050: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
4060: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
4070: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
4080: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
4090: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
40a0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74  *pExpr){.  sqlit
40b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
40c0: 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  >db;.  const cha
40d0: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78  r *z;..  if( pEx
40e0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
40f0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
4100: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
4110: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
4120: 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  |EP_Reduced|EP_T
4130: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a  okenOnly) );.  z
4140: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
4150: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21  en;.  assert( z!
4160: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4170: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
4180: 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[1]==0 ){.    
4190: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
41a0: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
41b0: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
41c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
41d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30  .    assert( z[0
41e0: 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45  ]=='?' );.    pE
41f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
4200: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
4210: 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 20  >nVar);.  }else 
4220: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
4230: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
4240: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4250: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
4260: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
4270: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
4280: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4290: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
42a0: 20 20 69 36 34 20 69 3b 0a 20 20 20 20 69 6e 74    i64 i;.    int
42b0: 20 62 4f 6b 20 3d 20 73 71 6c 69 74 65 33 41 74   bOk = sqlite3At
42c0: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 29 3b  oi64(&z[1], &i);
42d0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
42e0: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  umn = (ynVar)i;.
42f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4300: 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
4310: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
4320: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
4330: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4340: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4350: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74  MBER]-1 );.    t
4360: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
4370: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4380: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4390: 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  BER] );.    if( 
43a0: 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c  bOk==0 || i<1 ||
43b0: 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   i>db->aLimit[SQ
43c0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
43d0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
43e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
43f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
4400: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
4410: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
4420: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
4430: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
4440: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4450: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
4460: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
4470: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
4480: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4490: 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20  ar = (int)i;.   
44a0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
44b0: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
44c0: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
44d0: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
44e0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
44f0: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  able.    ** numb
4500: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
4510: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
4520: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
4530: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
4540: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
4550: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
4560: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
4570: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
4580: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
4590: 20 20 20 75 33 32 20 6e 3b 0a 20 20 20 20 6e 20     u32 n;.    n 
45a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
45b0: 30 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  0(z);.    for(i=
45c0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
45d0: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
45e0: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 50     Expr *pE = pP
45f0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
4600: 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  i];.      assert
4610: 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pE!=0 );.     
4620: 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 45 2d 3e   if( memcmp(pE->
4630: 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 2c 20 6e 29 3d  u.zToken, z, n)=
4640: 3d 30 20 26 26 20 70 45 2d 3e 75 2e 7a 54 6f 6b  =0 && pE->u.zTok
4650: 65 6e 5b 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  en[n]==0 ){.    
4660: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4670: 6d 6e 20 3d 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e  mn = pE->iColumn
4680: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
46a0: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
46b0: 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20  ->nVarExpr ){.  
46c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
46d0: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
46e0: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
46f0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
4700: 6e 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65  nVarExpr>=pParse
4710: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d  ->nVarExprAlloc-
4720: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  1 ){.        pPa
4730: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4740: 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56  oc += pParse->nV
4750: 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30  arExprAlloc + 10
4760: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
4770: 2d 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20  ->apVarExpr =.  
4780: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4790: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
47a0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
47b0: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
47c0: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
47d0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
47e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
47f0: 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  xprAlloc*sizeof(
4800: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
4810: 72 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  r[0]).          
4820: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
4830: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
4840: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4850: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
4860: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30  se->apVarExpr!=0
4870: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
4880: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50  se->apVarExpr[pP
4890: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b  arse->nVarExpr++
48a0: 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  ] = pExpr;.     
48b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
48c0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
48d0: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
48e0: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
48f0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4900: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
4910: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4920: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
4930: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
4940: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
4950: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
4960: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
4970: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
4980: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4990: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
49a0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
49b0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
49c0: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
49d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
49e0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
49f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4a00: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  te(db, p->pLeft)
4a10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4a20: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
4a30: 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
4a40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4a50: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
4a60: 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20  && (p->flags2 & 
4a70: 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65  EP2_MallocedToke
4a80: 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  n)!=0 ){.      s
4a90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4aa0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20   p->u.zToken);. 
4ab0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45 78 70     }.    if( Exp
4ac0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4ad0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
4ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
4af0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
4b00: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
4b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
4b20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4b30: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  lete(db, p->x.pL
4b40: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
4b50: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
4b60: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61  operty(p, EP_Sta
4b70: 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  tic) ){.    sqli
4b80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4b90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4ba0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
4bb0: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
4bc0: 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ted for the expr
4bd0: 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65  ession structure
4be0: 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
4bf0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
4c00: 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  t. This is alway
4c10: 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55  s one of EXPR_FU
4c20: 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f  LLSIZE,.** EXPR_
4c30: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45  REDUCEDSIZE or E
4c40: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
4c50: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
4c60: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
4c70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
4c80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4c90: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
4ca0: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54   ) return EXPR_T
4cb0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20  OKENONLYSIZE;.  
4cc0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
4cd0: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
4ce0: 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  d) ) return EXPR
4cf0: 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20  _REDUCEDSIZE;.  
4d00: 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c  return EXPR_FULL
4d10: 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  SIZE;.}../*.** T
4d20: 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a  he dupedExpr*Siz
4d30: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63  e() routines eac
4d40: 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  h return the num
4d50: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
4d60: 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72  uired.** to stor
4d70: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  e a copy of an e
4d80: 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70  xpression or exp
4d90: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54  ression tree.  T
4da0: 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a  hey differ in.**
4db0: 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65   how much of the
4dc0: 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65   tree is measure
4dd0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70  d..**.**     dup
4de0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
4df0: 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f  ()     Size of o
4e00: 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72  nly the Expr str
4e10: 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64  ucture .**     d
4e20: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
4e30: 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66  ()       Size of
4e40: 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f   Expr + space fo
4e50: 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64  r token.**     d
4e60: 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20  upedExprSize()  
4e70: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20           Expr + 
4e80: 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20  token + subtree 
4e90: 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a  components.**.**
4ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
4ef0: 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72  The dupedExprStr
4f00: 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69  uctSize() functi
4f10: 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76  on returns two v
4f20: 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65  alues OR-ed toge
4f30: 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74  ther:  .** (1) t
4f40: 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
4f50: 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20  d for a copy of 
4f60: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
4f70: 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20  re only and .** 
4f80: 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66  (2) the EP_xxx f
4f90: 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61  lags that indica
4fa0: 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75  te what the stru
4fb0: 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c  cture size shoul
4fc0: 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  d be..** The ret
4fd0: 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c  urn values is al
4fe0: 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  ways one of:.**.
4ff0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c  **      EXPR_FUL
5000: 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58  LSIZE.**      EX
5010: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20  PR_REDUCEDSIZE  
5020: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a   | EP_Reduced.**
5030: 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e        EXPR_TOKEN
5040: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
5050: 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68  kenOnly.**.** Th
5060: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74  e size of the st
5070: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66  ructure can be f
5080: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
5090: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
50a0: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74  .** of this rout
50b0: 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20  ine with 0xfff. 
50c0: 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62   The flags can b
50d0: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
50e0: 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ng the.** return
50f0: 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52   value with EP_R
5100: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
5110: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  nly..**.** Note 
5120: 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d  that with flags=
5130: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c  =EXPRDUP_REDUCE,
5140: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77   this routines w
5150: 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a  orks on full-siz
5160: 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29  e.** (unreduced)
5170: 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73   Expr objects as
5180: 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61   they or origina
5190: 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lly constructed 
51a0: 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a  by the parser..*
51b0: 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73  * During express
51c0: 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78  ion analysis, ex
51d0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
51e0: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
51f0: 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61  moved into.** la
5200: 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68  ter parts of teh
5210: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64   Expr object and
5220: 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f   that extra info
5230: 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65  rmation might ge
5240: 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66  t chopped.** off
5250: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
5260: 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20  on is reduced.  
5270: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69  Note also that i
5280: 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  t does not work 
5290: 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45 58 50  to.** make a EXP
52a0: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
52b0: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
52c0: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
52d0: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
52e0: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
52f0: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
5300: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
5310: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
5320: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
5330: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5340: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
5350: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
5360: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
5370: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
5380: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
5390: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
53a0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
53b0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
53c0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
53d0: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
53e0: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
53f0: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
5400: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
5410: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
5420: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69 66 28  allowed */.  if(
5430: 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44   0==(flags&EXPRD
5440: 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20  UP_REDUCE) ){.  
5450: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
5460: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
5470: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
5480: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
5490: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
54a0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
54b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
54c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
54d0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
54e0: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70   .    assert( (p
54f0: 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d  ->flags2 & EP2_M
5500: 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30  allocedToken)==0
5510: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
5520: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5530: 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d 3d 30  _Irreducible)==0
5540: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
5550: 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69 67 68  Left || p->pRigh
5560: 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20 7c 7c  t || p->pColl ||
5570: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
5580: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
5590: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
55a0: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
55b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
55c0: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
55d0: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
55e0: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
55f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
5600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5610: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5620: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
5630: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
5640: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
5650: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
5660: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
5670: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
5680: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
5690: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
56a0: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
56b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
56c0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
56d0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
56e0: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
56f0: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
5700: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
5710: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
5720: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5730: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
5740: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
5750: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
5760: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5770: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
5780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
5790: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
57a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
57b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
57c0: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
57d0: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
57e0: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
57f0: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
5800: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5810: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
5820: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
5830: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
5840: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
5850: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
5860: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
5870: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
5880: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
5890: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
58a0: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
58b0: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
58c0: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
58d0: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
58e0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
58f0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
5900: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
5910: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
5920: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
5930: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
5940: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
5950: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
5960: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
5970: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
5980: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
5990: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
59a0: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
59b0: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
59c0: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
59d0: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
59e0: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
59f0: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
5a00: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
5a10: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5a20: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5a30: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
5a40: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
5a50: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
5a60: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
5a70: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
5a80: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
5a90: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
5aa0: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
5ab0: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
5ac0: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
5ad0: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
5ae0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5af0: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
5b00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5b10: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
5b20: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
5b30: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
5b40: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
5b50: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
5b60: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
5b70: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
5b80: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
5b90: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
5ba0: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
5bb0: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
5bc0: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
5bd0: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
5be0: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
5bf0: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
5c00: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
5c10: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
5c20: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
5c30: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
5c40: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
5c50: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
5c60: 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a 20 70   passed the.** p
5c70: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  ortion of the bu
5c80: 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f  ffer copied into
5c90: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
5ca0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  n..*/.static Exp
5cb0: 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74  r *exprDup(sqlit
5cc0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
5cd0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a   int flags, u8 *
5ce0: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
5cf0: 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20  pr *pNew = 0;   
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
5d20: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70  eturn */.  if( p
5d30: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
5d40: 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28 66  t isReduced = (f
5d50: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5d60: 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41  UCE);.    u8 *zA
5d70: 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74  lloc;.    u32 st
5d80: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20  aticFlag = 0;.. 
5d90: 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66     assert( pzBuf
5da0: 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75  fer==0 || isRedu
5db0: 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  ced );..    /* F
5dc0: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
5dd0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77  to write the new
5de0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e   Expr structure.
5df0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75   */.    if( pzBu
5e00: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41  ffer ){.      zA
5e10: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
5e20: 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46 6c  ;.      staticFl
5e30: 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a  ag = EP_Static;.
5e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5e50: 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   zAlloc = sqlite
5e60: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
5e70: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
5e80: 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d  , flags));.    }
5e90: 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70  .    pNew = (Exp
5ea0: 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20  r *)zAlloc;..   
5eb0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
5ec0: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
5ed0: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
5ee0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
5ef0: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
5f00: 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  ed to.      ** b
5f10: 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20  y pNew. This is 
5f20: 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c  either EXPR_FULL
5f30: 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43  SIZE, EXPR_REDUC
5f40: 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20  EDSIZE or.      
5f50: 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  ** EXPR_TOKENONL
5f60: 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73  YSIZE. nToken is
5f70: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
5f80: 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73  er of bytes cons
5f90: 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  umed.      ** by
5fa0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
5fb0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
5fc0: 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  ing (if any)..  
5fd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
5fe0: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
5ff0: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
6000: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
6010: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63   flags);.      c
6020: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
6030: 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20  e = nStructSize 
6040: 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69  & 0xfff;.      i
6050: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  nt nToken;.     
6060: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
6070: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
6080: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
6090: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  oken ){.        
60a0: 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  nToken = sqlite3
60b0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
60c0: 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20  oken) + 1;.     
60d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
60e0: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
60f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
6100: 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20  Reduced ){.     
6110: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
6120: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6130: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
6140: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6150: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
6160: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
6170: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
6180: 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63 74  ize = exprStruct
6190: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Size(p);.       
61a0: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
61b0: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
61c0: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
61d0: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
61e0: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
61f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
6200: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f    /* Set the EP_
6210: 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65  Reduced, EP_Toke
6220: 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74  nOnly, and EP_St
6230: 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f  atic flags appro
6240: 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20  priately. */.   
6250: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26     pNew->flags &
6260: 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45  = ~(EP_Reduced|E
6270: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
6280: 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 70 4e  tatic);.      pN
6290: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74  ew->flags |= nSt
62a0: 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52  ructSize & (EP_R
62b0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
62c0: 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  nly);.      pNew
62d0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
62e0: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a  cFlag;..      /*
62f0: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
6300: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
6310: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69   any. */.      i
6320: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
6330: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65       char *zToke
6340: 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  n = pNew->u.zTok
6350: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c  en = (char*)&zAl
6360: 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20  loc[nNewSize];. 
6370: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54         memcpy(zT
6380: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
6390: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
63a0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 30    }..      if( 0
63b0: 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65  ==((p->flags|pNe
63c0: 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54  w->flags) & EP_T
63d0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
63e0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
63f0: 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c  the pNew->x.pSel
6400: 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70  ect or pNew->x.p
6410: 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a  List member. */.
6420: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
6430: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6440: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
6450: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6460: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
6470: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
6480: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69   p->x.pSelect, i
6490: 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20  sReduced);.     
64a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64b0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
64c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
64d0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  istDup(db, p->x.
64e0: 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63 65 64  pList, isReduced
64f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6500: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
6510: 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65  ill in pNew->pLe
6520: 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69  ft and pNew->pRi
6530: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ght. */.      if
6540: 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
6550: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
6560: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6570: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ly) ){.        z
6580: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
6590: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
65a0: 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
65b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
65c0: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
65d0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
65e0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65   pNew->pLeft = e
65f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6600: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
6610: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
6620: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
6630: 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70 28  Right = exprDup(
6640: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
6650: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6660: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6670: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
6680: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
6690: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
66a0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20   zAlloc;.       
66b0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
66c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
66d0: 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  ags2 = 0;.      
66e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e    if( !ExprHasAn
66f0: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
6700: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
6710: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
6720: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
6730: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
6740: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
6750: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
6760: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6770: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
6780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6790: 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    }..    }.  }. 
67a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
67b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
67c0: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
67d0: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
67e0: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
67f0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
6800: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
6810: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
6820: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
6830: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
6840: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
6850: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
6860: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
6870: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
6880: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
6890: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
68a0: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
68b0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
68c0: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
68d0: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
68e0: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
68f0: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
6900: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
6910: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
6920: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
6930: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
6940: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
6950: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
6960: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
6970: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
6980: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
6990: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
69a0: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
69b0: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
69c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
69d0: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
69e0: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
69f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
6a00: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
6a10: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
6a20: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
6a30: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
6a40: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
6a50: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
6a60: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
6a70: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
6a80: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
6a90: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
6aa0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
6ab0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
6ac0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
6ad0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
6ae0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6af0: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
6b00: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
6b10: 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e  flags){.  return
6b20: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
6b30: 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70  flags, 0);.}.Exp
6b40: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
6b50: 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  prListDup(sqlite
6b60: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
6b70: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6b80: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
6b90: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
6ba0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
6bb0: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
6bc0: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
6bd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
6be0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
6bf0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
6c00: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
6c10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
6c20: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
6c30: 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70  ECursor = 0;.  p
6c40: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65  New->nExpr = pNe
6c50: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
6c60: 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  Expr;.  pNew->a 
6c70: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
6c80: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
6c90: 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f    p->nExpr*sizeo
6ca0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
6cb0: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
6cc0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6cd0: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
6ce0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
6cf0: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
6d00: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
6d10: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
6d20: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
6d30: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
6d40: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
6d50: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70  em->pExpr;.    p
6d60: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
6d70: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6d80: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
6d90: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
6da0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
6db0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
6dc0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
6dd0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
6de0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
6df0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
6e00: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
6e10: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
6e20: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
6e30: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
6e40: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
6e50: 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d  >iCol = pOldItem
6e60: 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65  ->iCol;.    pIte
6e70: 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64  m->iAlias = pOld
6e80: 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20  Item->iAlias;.  
6e90: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
6ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
6eb0: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
6ec0: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
6ed0: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
6ee0: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
6ef0: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
6f00: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6f10: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
6f20: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
6f30: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
6f40: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
6f50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
6f60: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
6f70: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
6f80: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
6f90: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
6fa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
6fb0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
6fc0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
6fd0: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
6fe0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
6ff0: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
7000: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
7010: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7020: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
7030: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
7040: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
7050: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
7060: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7070: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
7080: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
7090: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
70a0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
70b0: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
70c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
70d0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
70e0: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
70f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7100: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
7110: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
7120: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
7130: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
7140: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
7150: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
7160: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
7170: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
7180: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
7190: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
71a0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
71b0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
71c0: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
71d0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
71e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
71f0: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
7200: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7210: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7220: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7230: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7240: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
7250: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7260: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
7270: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
7280: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
7290: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
72a0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
72b0: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
72c0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
72d0: 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  wItem->isPopulat
72e0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ed = pOldItem->i
72f0: 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20  sPopulated;.    
7300: 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pNewItem->zIndex
7310: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7320: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7330: 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e  >zIndex);.    pN
7340: 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ewItem->notIndex
7350: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e  ed = pOldItem->n
7360: 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70  otIndexed;.    p
7370: 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  NewItem->pIndex 
7380: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64  = pOldItem->pInd
7390: 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  ex;.    pTab = p
73a0: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
73b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
73c0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
73d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
73e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
73f0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
7400: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
7410: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7420: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
7430: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7440: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
7450: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7460: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
7470: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
7480: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
7490: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
74a0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
74b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
74c0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
74d0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
74e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
74f0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
7500: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
7510: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
7520: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
7530: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7540: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7550: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7560: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7570: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
7580: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7590: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
75a0: 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e  ew->nId = pNew->
75b0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b  nAlloc = p->nId;
75c0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
75d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
75e0: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
75f0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
7600: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
7610: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
7620: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
7630: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7640: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7650: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
7660: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
7670: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
7680: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
7690: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
76a0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
76b0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
76c0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
76d0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
76e0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
76f0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
7700: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
7710: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
7720: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
7730: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
7740: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
7750: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
7760: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65  t flags){.  Sele
7770: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
7780: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7790: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
77a0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
77b0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
77c0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
77d0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
77e0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
77f0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7800: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
7810: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  s);.  pNew->pSrc
7820: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
7830: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
7840: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7850: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
7860: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7870: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
7880: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
7890: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
78a0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
78b0: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
78c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
78d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
78e0: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
78f0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7900: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
7910: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7920: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
7930: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7940: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
7950: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
7960: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7970: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61  , p->pPrior, fla
7980: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  gs);.  pNew->pLi
7990: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
79a0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
79b0: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  it, flags);.  pN
79c0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
79d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
79e0: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61   p->pOffset, fla
79f0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  gs);.  pNew->iLi
7a00: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
7a10: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
7a20: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
7a30: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
7a40: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
7a50: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
7a60: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
7a70: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
7a80: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
7a90: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
7aa0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
7ab0: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
7ac0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
7ad0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
7ae0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
7af0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7b00: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
7b10: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
7b20: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
7b30: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
7b40: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
7b50: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
7b60: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
7b70: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
7b80: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
7b90: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
7ba0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
7bb0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
7bc0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
7bd0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7be0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
7bf0: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
7c00: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
7c10: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
7c20: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
7c30: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
7c40: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
7c50: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
7c60: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
7c70: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
7c80: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7c90: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
7ca0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
7cc0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
7cd0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
7ce0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
7cf0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
7d00: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
7d10: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
7d20: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
7d30: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
7d40: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
7d50: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
7d60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7d70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7d80: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
7d90: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
7da0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7db0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
7dc0: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
7dd0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
7de0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
7df0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
7e00: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
7e10: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
7e20: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
7e30: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
7e40: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7e50: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
7e60: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
7e70: 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20  Alloc*2 + 4;.   
7e80: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
7e90: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d  alloc(db, pList-
7ea0: 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69  >a, n*sizeof(pLi
7eb0: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
7ec0: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
7ed0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
7ee0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
7ef0: 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74  a = a;.    pList
7f00: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  ->nAlloc = sqlit
7f10: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
7f20: 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61 5b 30  b, a)/sizeof(a[0
7f30: 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ]);.  }.  assert
7f40: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
7f50: 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20  .  if( 1 ){.    
7f60: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7f70: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
7f80: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
7f90: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
7fa0: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
7fb0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
7fc0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
7fd0: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
7fe0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
7ff0: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
8000: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
8010: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
8020: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
8030: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8040: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
8050: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8060: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
8070: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
8080: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
8090: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  xprList.a[].zNam
80a0: 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  e element of the
80b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
80c0: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
80d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
80e0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
80f0: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
8100: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
8110: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d  error.  But pNam
8120: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
8130: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
8140: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8150: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
8160: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8170: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
8180: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
8190: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
81a0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
81b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
81c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
81d0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
81e0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
81f0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
8200: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
8210: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
8220: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8230: 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64  /* Name to be ad
8240: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ded */.  int deq
8250: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
8260: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73   /* True to caus
8270: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65  e the name to be
8280: 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a   dequoted */.){.
8290: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
82a0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
82b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
82c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
82d0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
82e0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
82f0: 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
8300: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
8310: 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
8320: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
8330: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
8340: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
8350: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  me==0 );.    pIt
8360: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
8370: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61  te3DbStrNDup(pPa
8380: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e  rse->db, pName->
8390: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
83a0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
83b0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20   pItem->zName ) 
83c0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
83d0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
83e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
83f0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8400: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
8410: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8420: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8430: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8440: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8450: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8460: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8470: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8480: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
8490: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
84a0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
84b0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
84c0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
84d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
84e0: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
84f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8500: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
8510: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8520: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8530: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8540: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8550: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8560: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8570: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72   span. */.  Expr
8580: 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20  Span *pSpan     
8590: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20      /* The span 
85a0: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29  to be added */.)
85b0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
85c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
85d0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
85e0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
85f0: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
8600: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
8610: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8620: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
8630: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
8640: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
8650: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
8660: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8670: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8680: 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70  d || pItem->pExp
8690: 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20  r==pSpan->pExpr 
86a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
86b0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
86c0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
86d0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
86e0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
86f0: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
8700: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
8730: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
8740: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
8750: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
8760: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
8770: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
8780: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
8790: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
87a0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
87b0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
87c0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
87d0: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
87e0: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
87f0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
8800: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
8810: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
8820: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
8830: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
8840: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8850: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
8860: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
8870: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
8880: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
8890: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
88a0: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
88b0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
88c0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
88d0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
88e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
88f0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
8900: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
8910: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
8920: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
8930: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
8940: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
8950: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8960: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
8970: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
8980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
8990: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
89a0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
89b0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
89c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
89d0: 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73  t->a!=0 || (pLis
89e0: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70  t->nExpr==0 && p
89f0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29  List->nAlloc==0)
8a00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
8a10: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73  ist->nExpr<=pLis
8a20: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66  t->nAlloc );.  f
8a30: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
8a40: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
8a50: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
8a60: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
8a70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8a80: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
8a90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8aa0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
8ab0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
8ac0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
8ad0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
8ae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8af0: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
8b00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8b10: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
8b20: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
8b30: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
8b40: 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75  backs.  Walker.u
8b50: 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72  .pi is a pointer
8b60: 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  .** to an intege
8b70: 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  r.  These routin
8b80: 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20  es are checking 
8b90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
8ba0: 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73   see.** if it is
8bb0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65   a constant.  Se
8bc0: 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74  t *Walker.u.pi t
8bd0: 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65  o 0 if the expre
8be0: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20  ssion is.** not 
8bf0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
8c00: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
8c10: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
8c20: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
8c30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
8c40: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
8c50: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a  prIsConstant().*
8c60: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
8c70: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
8c80: 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  in().**     sqli
8c90: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8ca0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a  tOrFunction().**
8cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
8cc0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
8cd0: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
8ce0: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
8cf0: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
8d00: 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e  r->u.i is 3 then
8d10: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
8d20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
8d30: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
8d40: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
8d50: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
8d60: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
8d70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
8d80: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
8d90: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
8da0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
8db0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20  lker->u.i==3 && 
8dc0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
8dd0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
8de0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
8df0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
8e00: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
8e10: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
8e20: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8e30: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
8e40: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
8e50: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
8e60: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
8e70: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
8e80: 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65     ** and pWalke
8e90: 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20  r->u.i==2 */.   
8ea0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
8eb0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
8ec0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72  lker->u.i==2 ) r
8ed0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f  eturn 0;.      /
8ee0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
8ef0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
8f00: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
8f10: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
8f20: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
8f30: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
8f40: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
8f50: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8f60: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
8f70: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8f80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
8f90: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8fa0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8fb0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
8fc0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8fd0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
8fe0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
8ff0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
9000: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
9010: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
9020: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
9030: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
9040: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
9050: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
9060: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
9070: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
9080: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
9090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
90a0: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
90b0: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
90c0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
90d0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
90e0: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
90f0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
9100: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
9110: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
9120: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
9130: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9140: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
9150: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
9160: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
9170: 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bort;.}.static i
9180: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
9190: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
91a0: 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Flag){.  Walker 
91b0: 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69  w;.  w.u.i = ini
91c0: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
91d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
91e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
91f0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
9200: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
9210: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
9220: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
9230: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
9240: 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  u.i;.}../*.** Wa
9250: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
9260: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
9270: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
9280: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
9290: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
92a0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
92b0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
92c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
92d0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
92e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
92f0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
9300: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
9310: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
9320: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
9330: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
9340: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
9350: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
9360: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
9370: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9380: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  t(Expr *p){.  re
9390: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
93a0: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
93b0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
93c0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
93d0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
93e0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
93f0: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
9400: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
9410: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
9420: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
9430: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
9440: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
9450: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
9460: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
9470: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
9480: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
9490: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
94a0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
94b0: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
94c0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
94d0: 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a  Const(p, 3);.}..
94e0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
94f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
9500: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
9510: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
9520: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
9530: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
9540: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
9550: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
9560: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
9570: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
9580: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
9590: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
95a0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
95b0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
95c0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
95d0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
95e0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
95f0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
9600: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
9610: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
9620: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
9630: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9640: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
9650: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
9660: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b  prIsConst(p, 2);
9670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
9680: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
9690: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
96a0: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
96b0: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
96c0: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
96d0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
96e0: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
96f0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
9700: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
9710: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
9720: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
9730: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
9740: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
9750: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
9760: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
9770: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
9780: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
9790: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
97a0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
97b0: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
97c0: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
97d0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  t rc = 0;.  if( 
97e0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
97f0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
9800: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
9810: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
9820: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
9830: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
9840: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
9850: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9860: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
9870: 2e 7a 54 6f 6b 65 6e 2c 20 70 56 61 6c 75 65 29  .zToken, pValue)
9880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9890: 72 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  rc==0 );.      b
98a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
98b0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
98c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
98d0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
98e0: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
98f0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
9900: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9910: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
9920: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
9930: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
9940: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
9950: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
9960: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
9970: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
9980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
99a0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
99b0: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
99c0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
99d0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
99e0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
99f0: 6f 6b 65 6e 4f 6e 6c 79 29 0a 20 20 20 20 20 20  okenOnly).      
9a00: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e           || (p->
9a10: 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c  flags2 & EP2_Mal
9a20: 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29  locedToken)==0 )
9a30: 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
9a40: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 2d  _INTEGER;.    p-
9a50: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
9a60: 56 61 6c 75 65 3b 0a 20 20 20 20 70 2d 3e 75 2e  Value;.    p->u.
9a70: 69 56 61 6c 75 65 20 3d 20 2a 70 56 61 6c 75 65  iValue = *pValue
9a80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9a90: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
9aa0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
9ab0: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
9ac0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
9ad0: 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
9ae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
9af0: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
9b00: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
9b10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
9b20: 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
9b30: 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
9b40: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
9b50: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
9b60: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
9b70: 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
9b80: 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
9b90: 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
9ba0: 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
9bb0: 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
9bc0: 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
9bd0: 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
9be0: 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
9bf0: 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
9c00: 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
9c10: 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
9c20: 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
9c30: 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
9c40: 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
9c50: 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
9c60: 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
9c70: 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
9c80: 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
9c90: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
9ca0: 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
9cb0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
9cc0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
9cd0: 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
9ce0: 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
9cf0: 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
9d00: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
9d10: 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
9d20: 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
9d30: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
9d40: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
9d50: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
9d60: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
9d70: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
9d80: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
9d90: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
9da0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
9db0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
9dc0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
9dd0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
9de0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
9df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
9e00: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
9e10: 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  0;.    default:.
9e20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9e30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9e40: 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e 75  erate an OP_IsNu
9e50: 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ll instruction t
9e60: 68 61 74 20 74 65 73 74 73 20 72 65 67 69 73 74  hat tests regist
9e70: 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75 6d 70  er iReg and jump
9e80: 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  s.** to location
9e90: 20 69 44 65 73 74 20 69 66 20 74 68 65 20 76 61   iDest if the va
9ea0: 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73 20 4e  lue in iReg is N
9eb0: 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ULL.  The value 
9ec0: 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61 73 20  in iReg .** was 
9ed0: 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45 78 70  computed by pExp
9ee0: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 6c 6f  r.  If we can lo
9ef0: 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74 20 63  ok at pExpr at c
9f00: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 0a  ompile-time and.
9f10: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61  ** determine tha
9f20: 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72 20 67  t it can never g
9f30: 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c 20  enerate a NULL, 
9f40: 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e 75  then the OP_IsNu
9f50: 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ll operation.** 
9f60: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a  can be omitted..
9f70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9f80: 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
9f90: 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  p(.  Vdbe *v,   
9fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9fb0: 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
9fc0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
9fd0: 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  st Expr *pExpr, 
9fe0: 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74   /* Only generat
9ff0: 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20 74  e OP_IsNull if t
a000: 68 69 73 20 65 78 70 72 20 63 61 6e 20 62 65 20  his expr can be 
a010: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52  NULL */.  int iR
a020: 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eg,           /*
a030: 20 54 65 73 74 20 74 68 65 20 76 61 6c 75 65 20   Test the value 
a040: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
a050: 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69   for NULL */.  i
a060: 6e 74 20 69 44 65 73 74 20 20 20 20 20 20 20 20  nt iDest        
a070: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
a080: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
a090: 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  null */.){.  if(
a0a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
a0b0: 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29 7b 0a  eNull(pExpr) ){.
a0c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a0d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
a0e0: 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73 74 29  ll, iReg, iDest)
a0f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
a100: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
a110: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
a120: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
a130: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
a140: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
a150: 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
a160: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
a170: 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
a180: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
a190: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a1a0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
a1b0: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
a1c0: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
a1d0: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
a1e0: 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
a1f0: 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
a200: 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
a210: 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
a220: 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
a230: 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
a240: 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
a250: 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
a260: 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
a270: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
a280: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
a290: 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
a2a0: 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
a2b0: 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
a2c0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74  E_AFF_NONE ) ret
a2d0: 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
a2e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
a2f0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
a300: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
a310: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
a320: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
a330: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
a340: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
a350: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
a360: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
a370: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
a380: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
a390: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
a3a0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
a3b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a3c0: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
a3d0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
a3e0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
a3f0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
a400: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
a410: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
a420: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
a430: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
a440: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
a450: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
a460: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a470: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
a480: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
a490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a4a0: 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
a4b0: 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
a4c0: 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
a4d0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
a4e0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
a4f0: 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
a500: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
a510: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
a520: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a530: 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
a540: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
a550: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a560: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a570: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
a580: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
a590: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
a5a0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
a5b0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
a5c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
a5d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a5e0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
a5f0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
a600: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
a610: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
a620: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
a630: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
a640: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
a650: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a660: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
a670: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
a680: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
a690: 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  to the IN operat
a6a0: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
a6b0: 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66  on a.** query of
a6c0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
a6d0: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
a6e0: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68  CT ...).**.** Wh
a6f0: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  ere the SELECT..
a700: 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20 73  . clause is as s
a710: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
a720: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
a730: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  s.** routine..**
a740: 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f  .** The Select o
a750: 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20  bject passed in 
a760: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
a770: 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e   preprocessed an
a780: 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68  d no.** errors h
a790: 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a  ave been found..
a7a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
a7b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
a7c0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
a7d0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
a7e0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
a7f0: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
a800: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a810: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a820: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
a830: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
a840: 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74          /* right
a850: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
a860: 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20   is SELECT */.  
a870: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
a880: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
a890: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
a8a0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
a8b0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
a8c0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
a8d0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
a8e0: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
a8f0: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
a900: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
a910: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
a920: 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
a930: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
a940: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
a950: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
a960: 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
a970: 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
a980: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
a990: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
a9a0: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
a9b0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
a9c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
a9d0: 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
a9e0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
a9f0: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
aa00: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
aa10: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa30: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
aa40: 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
aa50: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
aa60: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
aa70: 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
aa80: 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
aa90: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
aaa0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
aab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
aac0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
aad0: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
aae0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
aaf0: 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
ab00: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
ab10: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ab20: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
ab30: 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
ab40: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
ab50: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
ab60: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
ab70: 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
ab80: 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
ab90: 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
aba0: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66  >a[0].pTab;.  if
abb0: 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  ( NEVER(pTab==0)
abc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
abd0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
abe0: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
abf0: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
ac00: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
ac10: 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
ac20: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
ac30: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
ac40: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
ac50: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
ac60: 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
ac70: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
ac80: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
ac90: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
aca0: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d      /* One colum
acb0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
acc0: 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c  set */.  if( pEL
acd0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
ace0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
acf0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
ad00: 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sult is a column
ad10: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
ad20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ad30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ad40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
ad50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
ad60: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
ad70: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
ad80: 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
ad90: 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20  .** It's job is 
ada0: 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
adb0: 65 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63  e a b-tree struc
adc0: 74 75 72 65 20 74 68 61 74 20 6d 61 79 20 62 65  ture that may be
add0: 20 75 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20   used.** either 
ade0: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
adf0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e  ership of the (.
ae00: 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74  ..) set or to it
ae10: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
ae20: 20 69 74 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b   its members, sk
ae30: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
ae40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
ae50: 65 78 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ex of the cursor
ae60: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62   opened on the b
ae70: 2d 74 72 65 65 20 28 64 61 74 61 62 61 73 65 20  -tree (database 
ae80: 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20  table, database 
ae90: 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68  index .** or eph
aea0: 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20  ermal table) is 
aeb0: 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54  stored in pX->iT
aec0: 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  able before this
aed0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
aee0: 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  s..** The return
aef0: 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ed value of this
af00: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61   function indica
af10: 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74  tes the b-tree t
af20: 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ype, as follows:
af30: 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  .**.**   IN_INDE
af40: 58 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75  X_ROWID - The cu
af50: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
af60: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
af70: 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
af80: 45 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63  EX_INDEX - The c
af90: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
afa0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 69   on a database i
afb0: 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
afc0: 44 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20  DEX_EPH -   The 
afd0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
afe0: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
aff0: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b010: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
b020: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
b030: 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
b040: 62 2d 74 72 65 65 20 6d 61 79 20 6f 6e 6c 79 20  b-tree may only 
b050: 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53  be used if the S
b060: 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
b070: 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a  simple.** form:.
b080: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b090: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
b0a0: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
b0b0: 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70  the prNotFound p
b0c0: 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
b0d0: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77  hen the b-tree w
b0e0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
b0f0: 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
b100: 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
b110: 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20  s, skipping any 
b120: 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74  duplicates. In t
b130: 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65  his case an.** e
b140: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
b150: 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ust be used unle
b160: 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
b170: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72  <column> is guar
b180: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
b190: 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
b1a0: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
b1b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
b1c0: 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61   KEY or it.** ha
b1d0: 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  s a UNIQUE const
b1e0: 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20  raint or UNIQUE 
b1f0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  index..**.** If 
b200: 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70  the prNotFound p
b210: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
b220: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
b230: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
b240: 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
b250: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
b260: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
b270: 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
b280: 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
b290: 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
b2a0: 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45  mn> is an INTEGE
b2b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
b2c0: 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a   an index can .*
b2d0: 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20  * be found with 
b2e0: 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20  <column> as its 
b2f0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
b300: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
b310: 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
b320: 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
b330: 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
b340: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
b350: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f  .** needs to kno
b360: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
b370: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
b380: 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e  ontains an SQL N
b390: 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e  ULL .** value in
b3a0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63   order to correc
b3b0: 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78 70  tly evaluate exp
b3c0: 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58  ressions like "X
b3d0: 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20   IN (Y, Z)"..** 
b3e0: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
b3f0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
b400: 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74  (...) might cont
b410: 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
b420: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
b430: 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
b440: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
b450: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
b460: 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
b470: 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20  to *prNotFound. 
b480: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
b490: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
b4a0: 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
b4b0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
b4c0: 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20  hen *prNotFound 
b4d0: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
b4e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  d..**.** If a re
b4f0: 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
b500: 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61  ted and its loca
b510: 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a  tion stored in *
b520: 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e  prNotFound, then
b530: 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20  .** its initial 
b540: 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20  value is NULL.  
b550: 49 66 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65  If the (...) doe
b560: 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e  s not remain con
b570: 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65  stant.** for the
b580: 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65   duration of the
b590: 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65   query (i.e. the
b5a0: 20 53 45 4c 45 43 54 20 77 69 74 68 69 6e 20 74   SELECT within t
b5b0: 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61  he (...).** is a
b5c0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
b5d0: 75 65 72 79 29 20 74 68 65 6e 20 74 68 65 20 76  uery) then the v
b5e0: 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  alue of the allo
b5f0: 63 61 74 65 64 20 72 65 67 69 73 74 65 72 20 69  cated register i
b600: 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55  s.** reset to NU
b610: 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65  LL each time the
b620: 20 73 75 62 71 75 65 72 79 20 69 73 20 72 65 72   subquery is rer
b630: 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  un. This allows 
b640: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
b650: 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20 65   use vdbe code e
b660: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
b670: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
b680: 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65 72  *   if( register
b690: 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20  ==NULL ){.**    
b6a0: 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73   has_null = <tes
b6b0: 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74  t if data struct
b6c0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c  ure contains nul
b6d0: 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74  l>.**     regist
b6e0: 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a  er = 1.**   }.**
b6f0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
b700: 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68  avoid running th
b710: 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20  e <test if data 
b720: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
b730: 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74  ns null>.** test
b740: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
b750: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   is necessary..*
b760: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
b770: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
b780: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
b790: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
b7a0: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69  rse, Expr *pX, i
b7b0: 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b  nt *prNotFound){
b7c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
b7f0: 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
b800: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
b810: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
b820: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
b840: 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
b850: 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
b860: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
b870: 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
b880: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
b890: 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
b8a0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
b8b0: 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74 46  Unique = (prNotF
b8c0: 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54  ound==0);   /* T
b8d0: 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
b8e0: 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 0a 20 20  be unique */..  
b8f0: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
b900: 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43  TK_IN );..  /* C
b910: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
b920: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
b930: 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65   or index can be
b940: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61   used to.  ** sa
b950: 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e  tisfy the query.
b960: 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72    This is prefer
b970: 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69  able to generati
b980: 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65  ng a new .  ** e
b990: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a  phemeral table..
b9a0: 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72    */.  p = (Expr
b9b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
b9c0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20  EP_xIsSelect) ? 
b9d0: 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20  pX->x.pSelect : 
b9e0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
b9f0: 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30  (pParse->nErr==0
ba00: 29 20 26 26 20 69 73 43 61 6e 64 69 64 61 74 65  ) && isCandidate
ba10: 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20  ForInOpt(p) ){. 
ba20: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
ba30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
ba40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
ba50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ba60: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45   */.    Expr *pE
ba70: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
ba80: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 20 20 20 2f  >a[0].pExpr;   /
ba90: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f  * Expression <co
baa0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn> */.    int
bab0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
bac0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
bad0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
bae0: 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  column <column> 
baf0: 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  */.    Vdbe *v =
bb00: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
bb10: 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
bb20: 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
bb30: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
bb40: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
bb50: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
bb60: 70 54 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 61  pTab;      /* Ta
bb70: 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
bb80: 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
bbb0: 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70  tabase idx for p
bbc0: 54 61 62 20 2a 2f 0a 20 20 20 0a 20 20 20 20 2f  Tab */.   .    /
bbd0: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72  * Code an OP_Ver
bbe0: 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50  ifyCookie and OP
bbf0: 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
bc00: 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
bc10: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
bc20: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
bc30: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
bc40: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
bc50: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
bc60: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
bc70: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
bc80: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
bc90: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
bca0: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
bcb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
bcc0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
bcd0: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
bce0: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
bcf0: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
bd00: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
bd10: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
bd20: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
bd30: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
bd40: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
bd50: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
bd60: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
bd70: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
bd80: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
bd90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
bda0: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20     int iAddr;.. 
bdb0: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
bdc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bdd0: 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a  , OP_If, iMem);.
bde0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bdf0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
be00: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
be10: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
be20: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
be30: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
be40: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
be50: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
be60: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
be70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
be80: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
be90: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
bea0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
beb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
bed0: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
bee0: 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
bef0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
bf00: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
bf10: 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e  omparison. If an
bf20: 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20   index is to.   
bf30: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e     ** be used in
bf40: 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70   place of a temp
bf50: 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  -table, it must 
bf60: 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72  be ordered accor
bf70: 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ding.      ** to
bf80: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
bf90: 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20  sequence.  */.  
bfa0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
bfb0: 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
bfc0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
bfd0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
bfe0: 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  t, pExpr);..    
bff0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
c000: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
c010: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
c020: 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20  o perform the . 
c030: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
c040: 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  on is the same a
c050: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
c060: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66  f the column. If
c070: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
c080: 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
c090: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
c0a0: 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ny index..      
c0b0: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 61 66  */.      char af
c0c0: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
c0d0: 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20 20  finity(pX);.    
c0e0: 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f    int affinity_o
c0f0: 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  k = (pTab->aCol[
c100: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  iCol].affinity==
c110: 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45  aff||aff==SQLITE
c120: 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20  _AFF_NONE);..   
c130: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
c140: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
c150: 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66  & eType==0 && af
c160: 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d  finity_ok; pIdx=
c170: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
c180: 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d        if( (pIdx-
c190: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
c1a0: 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ol).         && 
c1b0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
c1c0: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
c1d0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
c1e0: 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20   0)==pReq.      
c1f0: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
c200: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
c210: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
c220: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
c230: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
c240: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
c250: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
c260: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
c270: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
c280: 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b       char *pKey;
c290: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b  .  .          pK
c2a0: 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ey = (char *)sql
c2b0: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
c2c0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
c2d0: 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20            iAddr 
c2e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c2f0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d  Op1(v, OP_If, iM
c300: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  em);.          s
c310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c320: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c330: 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20  1, iMem);.  .   
c340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c350: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
c360: 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
c370: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  Idx->tnum, iDb,.
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c3a0: 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  Key,P4_KEYINFO_H
c3b0: 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20  ANDOFF);.       
c3c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c3d0: 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
c3e0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
c3f0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
c400: 45 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20  EX_INDEX;..     
c410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c420: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
c430: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
c440: 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20  ( prNotFound && 
c450: 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  !pTab->aCol[iCol
c460: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  ].notNull ){.   
c470: 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46           *prNotF
c480: 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ound = ++pParse-
c490: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
c4a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c4b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c4c0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
c4d0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
c4e0: 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73  ot found an exis
c4f0: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
c500: 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
c510: 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
c520: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
c530: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
c540: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
c550: 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
c560: 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c      */.    doubl
c570: 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  e savedNQueryLoo
c580: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
c590: 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
c5a0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
c5b0: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
c5c0: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
c5d0: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29  if( prNotFound )
c5e0: 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f  {.      *prNotFo
c5f0: 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  und = rMayHaveNu
c600: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
c610: 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Mem;.    }else{.
c620: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c630: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
c640: 6f 70 3e 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a  op>(double)1 );.
c650: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
c660: 75 65 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75 62  ueryLoop = (doub
c670: 6c 65 29 31 3b 0a 20 20 20 20 20 20 69 66 28 20  le)1;.      if( 
c680: 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
c690: 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
c6a0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20  AnyProperty(pX, 
c6b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
c6c0: 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
c6d0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
c6e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c6f0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
c700: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
c710: 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  pX, rMayHaveNull
c720: 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  , eType==IN_INDE
c730: 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50  X_ROWID);.    pP
c740: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
c750: 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
c760: 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  op;.  }else{.   
c770: 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
c780: 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ab;.  }.  return
c790: 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
c7a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c7b0: 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
c7c0: 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
c7d0: 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65   as a subquery e
c7e0: 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54  xpression, EXIST
c7f0: 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72  S,.** or IN oper
c800: 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
c810: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
c820: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
c830: 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
c840: 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
c850: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
c860: 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
c870: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
c880: 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
c890: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
c8a0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
c8b0: 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
c8c0: 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
c8d0: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
c8e0: 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
c8f0: 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
c900: 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
c910: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
c920: 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
c930: 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
c940: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
c950: 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
c960: 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
c970: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
c980: 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
c990: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
c9a0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
c9b0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
c9c0: 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
c9d0: 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
c9e0: 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
c9f0: 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
ca00: 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
ca10: 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
ca20: 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
ca30: 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
ca40: 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
ca50: 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
ca60: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
ca70: 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
ca80: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
ca90: 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
caa0: 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
cab0: 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
cac0: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
cad0: 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
cae0: 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
caf0: 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
cb00: 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
cb10: 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
cb20: 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
cb30: 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
cb40: 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
cb50: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68   Furthermore, th
cb60: 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48 45  e IN is in a WHE
cb70: 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  RE clause and th
cb80: 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61 6e  at we really wan
cb90: 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65 20  t.** to iterate 
cba0: 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f 66 20  over the RHS of 
cbb0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
cbc0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69 63  in order to quic
cbd0: 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c  kly locate.** al
cbe0: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  l corresponding 
cbf0: 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41  LHS elements.  A
cc00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
cc10: 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
cc20: 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  ze.** the regist
cc30: 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
cc40: 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c  HaveNull to NULL
cc50: 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
cc60: 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a  nes will take.**
cc70: 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
cc80: 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  g this register 
cc90: 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
cca0: 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
ccb0: 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
ccc0: 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
ccd0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d   is zero, that m
cce0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
ccf0: 62 71 75 65 72 79 20 69 73 20 62 65 69 6e 67 20  bquery is being 
cd00: 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62  used.** for memb
cd10: 65 72 73 68 69 70 20 74 65 73 74 69 6e 67 20 6f  ership testing o
cd20: 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e  nly.  There is n
cd30: 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61  o need to initia
cd40: 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69  lize any.** regi
cd50: 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61 74  sters to indicat
cd60: 65 20 74 68 65 20 70 72 65 73 65 6e 73 65 20 6f  e the presense o
cd70: 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c  r absence of NUL
cd80: 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a  Ls on the RHS..*
cd90: 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
cda0: 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
cdb0: 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
cdc0: 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
cdd0: 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
cde0: 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72  lt.  For IN oper
cdf0: 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65  ators or if an e
ce00: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
ce10: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
ce20: 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53   0..*/.#ifndef S
ce30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
ce40: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
ce50: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
ce60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ce70: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
ce80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ce90: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
cea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
ceb0: 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
cec0: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
ced0: 0a 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e  .  int rMayHaveN
cee0: 75 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  ull,       /* Re
cef0: 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
cf00: 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
cf10: 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
cf20: 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cf40: 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
cf50: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
cf60: 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
cf70: 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20  t testAddr = 0; 
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
cfa0: 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
cfb0: 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30  /.  int rReg = 0
cfc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cfe0: 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20  egister storing 
cff0: 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56  resulting */.  V
d000: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
d010: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d020: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
d030: 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
d040: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
d050: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a  ePush(pParse);..
d060: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
d070: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
d080: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
d090: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
d0a0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
d0b0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
d0c0: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
d0d0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
d0e0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
d0f0: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
d100: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
d110: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
d120: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
d130: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d140: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
d150: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
d160: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
d170: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
d180: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
d190: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
d1a0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
d1b0: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
d1c0: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
d1d0: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
d1e0: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
d1f0: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
d200: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
d210: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
d220: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
d230: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
d240: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
d250: 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
d260: 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b      int mem = ++
d270: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d290: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65  Op1(v, OP_If, me
d2a0: 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72  m);.    testAddr
d2b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d2c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d2d0: 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20  er, 1, mem);.   
d2e0: 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64   assert( testAdd
d2f0: 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  r>0 || pParse->d
d300: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d310: 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  );.  }..  switch
d320: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
d330: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
d340: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
d350: 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
d360: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
d370: 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
d380: 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79   IN */.      Key
d390: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 20 20 20  Info keyInfo;   
d3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
d3b0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 67 65 6e 65  nfo for the gene
d3c0: 72 61 74 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  rated table */. 
d3d0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
d400: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
d410: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
d420: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
d430: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
d440: 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
d450: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
d460: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  /..      if( rMa
d470: 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
d480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d490: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d4a0: 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  l, 0, rMayHaveNu
d4b0: 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ll);.      }..  
d4c0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
d4d0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
d4e0: 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  ty(pLeft);..    
d4f0: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
d500: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
d510: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
d520: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
d530: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
d540: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
d550: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
d560: 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
d570: 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
d580: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
d590: 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64  single-field ind
d5a0: 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
d5b0: 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
d5c0: 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
d5d0: 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  he SELECT or the
d5e0: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
d5f0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
d600: 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
d610: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
d620: 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
d630: 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
d640: 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
d650: 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
d660: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
d670: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
d680: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
d690: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
d6a0: 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
d6b0: 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
d6c0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
d6d0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
d6e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
d6f0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
d700: 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
d710: 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
d720: 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
d730: 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
d740: 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
d750: 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
d760: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
d770: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
d780: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
d790: 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
d7a0: 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
d7b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
d7c0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
d7d0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d7e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d7f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d800: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d810: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
d820: 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20   !isRowid);.    
d830: 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
d840: 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ll==0 ) sqlite3V
d850: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
d860: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
d870: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
d880: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
d890: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
d8a0: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
d8b0: 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66  d = 1;..      if
d8c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
d8d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
d8e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
d8f0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
d900: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
d910: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
d920: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
d930: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
d940: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
d950: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
d960: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
d970: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
d980: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
d990: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
d9a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d9b0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
d9c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
d9d0: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
d9e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
d9f0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
da00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
da10: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
da20: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
da30: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
da40: 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 75  st.affinity = (u
da50: 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
da60: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
da70: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
da80: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
da90: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
daa0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
dab0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
dac0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64 65  ->x.pSelect, &de
dad0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
dae0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
daf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
db00: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
db10: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
db20: 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
db30: 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26 20  YS(pEList!=0 && 
db40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29  pEList->nExpr>0)
db50: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
db60: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
db70: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
db80: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
db90: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
dba0: 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft,.            
dbb0: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
dbc0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
dbd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dbe0: 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
dbf0: 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  .pList!=0) ){.  
dc00: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
dc10: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
dc20: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
dc30: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
dc40: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
dc50: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
dc60: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
dc70: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
dc80: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
dc90: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
dca0: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
dcb0: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
dcc0: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
dcd0: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
dce0: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
dcf0: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
dd00: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
dd10: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
dd20: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
dd30: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
dd40: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
dd50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
dd60: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
dd70: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
dd80: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
dd90: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
dda0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
ddb0: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
ddc0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
ddd0: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
dde0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
ddf0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
de00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
de10: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
de20: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
de30: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
de40: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
de50: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
de60: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
de70: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
de80: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
de90: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
dea0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
deb0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
dec0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ded0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
dee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
def0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
df00: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
df10: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
df20: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
df30: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
df40: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
df50: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
df60: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
df70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
df80: 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
df90: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
dfa0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
dfb0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
dfc0: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
dfd0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
dfe0: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
dff0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
e000: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
e010: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
e020: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
e030: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
e040: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
e050: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
e060: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
e070: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
e080: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
e090: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
e0a0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
e0b0: 66 28 20 74 65 73 74 41 64 64 72 20 26 26 20 21  f( testAddr && !
e0c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e0d0: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
e0e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e0f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
e100: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
e110: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   2);.           
e120: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
e130: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
e140: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
e150: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
e160: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
e170: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
e180: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
e190: 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
e1a0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
e1b0: 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
e1c0: 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e1e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
e1f0: 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
e200: 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
e210: 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
e220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e230: 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
e240: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
e250: 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
e260: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
e270: 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
e280: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e290: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e2a0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e2e0: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e300: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e310: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
e320: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
e330: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
e340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e360: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
e370: 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
e380: 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
e390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e3a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
e3b0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
e3c0: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e3e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e3f0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
e400: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
e410: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
e420: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
e430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e440: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
e450: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
e460: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
e470: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
e480: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
e490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e4a0: 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20   !isRowid ){.   
e4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e4c0: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
e4d0: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
e4e0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e500: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
e510: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
e520: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
e530: 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
e540: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
e550: 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
e560: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
e570: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e580: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
e590: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
e5a0: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
e5b0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
e5c0: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
e5d0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
e5e0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
e5f0: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
e600: 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
e610: 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
e620: 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
e630: 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
e640: 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
e650: 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
e660: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
e670: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
e680: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
e690: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
e6a0: 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e6c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e6d0: 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
e6e0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
e6f0: 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
e700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
e710: 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
e720: 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
e730: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e740: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
e750: 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
e760: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e770: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
e780: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e790: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
e7a0: 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
e7b0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
e7c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
e7d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
e7e0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
e7f0: 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
e800: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
e810: 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
e820: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
e830: 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
e840: 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
e850: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
e860: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
e870: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
e880: 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
e890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e8a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
e8b0: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
e8c0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
e8d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
e8e0: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
e8f0: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
e900: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
e910: 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
e920: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e930: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e940: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
e950: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
e960: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
e970: 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
e980: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
e990: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
e9a0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
e9b0: 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
e9c0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
e9d0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
e9e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
e9f0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
ea00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54      &sqlite3IntT
ea30: 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20  okens[1]);.     
ea40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
ea50: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
ea60: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
ea70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
ea80: 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20     }.      rReg 
ea90: 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20  = dest.iParm;.  
eaa0: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
eab0: 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20  ucible(pExpr);. 
eac0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ead0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
eae0: 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c  tAddr ){.    sql
eaf0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
eb00: 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b  (v, testAddr-1);
eb10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
eb20: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
eb30: 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e, 1);..  return
eb40: 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
eb50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
eb60: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
eb70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
eb80: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
eb90: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
eba0: 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
ebb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
ebc0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
ebd0: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
ebe0: 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
ebf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
ec00: 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
ec10: 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  is a scalar expr
ec20: 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67  ession.  The rig
ec30: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
ec40: 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61  S).** is an arra
ec50: 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
ec60: 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65  e values.  The e
ec70: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
ec80: 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a  e if the LHS is.
ec90: 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
eca0: 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68  hin the RHS.  Th
ecb0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65  e value of the e
ecc0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b  xpression is unk
ecd0: 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69  nown (NULL).** i
ece0: 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
ecf0: 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20  L or if the LHS 
ed00: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
ed10: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
ed20: 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63  and the.** RHS c
ed30: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
ed40: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
ed50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ed60: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
ed70: 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  de will jump to 
ed80: 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
ed90: 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
eda0: 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
edb0: 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
edc0: 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
edd0: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
ede0: 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
edf0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
ee00: 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
ee10: 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
ee20: 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
ee30: 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
ee40: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
ee50: 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
ee60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
ee70: 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
ee80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ee90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
eea0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
eeb0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
eec0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
eed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
eee0: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
eef0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
ef00: 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
ef10: 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
ef20: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
ef30: 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
ef40: 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
ef50: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
ef60: 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
ef70: 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
ef80: 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
ef90: 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
efa0: 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
efb0: 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
efc0: 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
efd0: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
efe0: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
eff0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
f000: 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74  rison affinity t
f010: 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65  o use */.  int e
f020: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
f030: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
f040: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b  RHS */.  int r1;
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f060: 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
f070: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64  register */.  Vd
f080: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
f090: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
f0a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f0b0: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ion */..  /* Com
f0c0: 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20  pute the RHS.   
f0d0: 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
f0e0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
f0f0: 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70  cursor.  ** pExp
f100: 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63  r->iTable will c
f110: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
f120: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
f130: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
f140: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f150: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
f160: 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
f170: 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
f180: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
f190: 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
f1a0: 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
f1b0: 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
f1c0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
f1d0: 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
f1e0: 2c 20 70 45 78 70 72 2c 20 26 72 52 68 73 48 61  , pExpr, &rRhsHa
f1f0: 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69  sNull);..  /* Fi
f200: 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
f210: 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
f220: 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
f230: 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
f240: 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
f250: 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
f260: 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
f270: 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
f280: 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66  e for.  ** P4 of
f290: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
f2a0: 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20    */.  affinity 
f2b0: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
f2c0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
f2d0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
f2e0: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
f2f0: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
f300: 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  )"..  */.  sqlit
f310: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
f320: 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20  pParse);.  r1 = 
f330: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f340: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
f350: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f360: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f370: 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  t, r1);..  /* If
f380: 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c   the LHS is NULL
f390: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
f3a0: 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c 73  t is either fals
f3b0: 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64  e or NULL depend
f3c0: 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74  ing.  ** on whet
f3d0: 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65  her the RHS is e
f3e0: 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73  mpty or not, res
f3f0: 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a  pectively..  */.
f400: 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
f410: 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
f420: 0a 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74  .    /* Shortcut
f430: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
f440: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66  case where the f
f450: 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75  alse and NULL ou
f460: 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a  tcomes are.    *
f470: 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  * the same. */. 
f480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f490: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
f4a0: 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c  l, r1, destIfNul
f4b0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
f4c0: 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
f4d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f4e0: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31  , OP_NotNull, r1
f4f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f500: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f510: 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
f520: 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
f530: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
f540: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f550: 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
f560: 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
f570: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f580: 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20   addr1);.  }..  
f590: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
f5a0: 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
f5b0: 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
f5c0: 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
f5d0: 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
f5e0: 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20  b-tree.    */.  
f5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f600: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
f610: 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46  Int, r1, destIfF
f620: 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alse);.    sqlit
f630: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f640: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45  OP_NotExists, pE
f650: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
f660: 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20  tIfFalse, r1);. 
f670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
f680: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
f690: 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78   RHS is an index
f6a0: 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a   b-tree..    */.
f6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f6c0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
f6d0: 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20  nity, r1, 1, 0, 
f6e0: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a  &affinity, 1);..
f6f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
f700: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
f710: 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  t fails, then th
f720: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f730: 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e  .    ** "x IN (.
f740: 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
f750: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
f760: 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65   or NULL. If the
f770: 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74   set.    ** cont
f780: 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  ains no NULL val
f790: 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
f7a0: 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68  sult is 0. If th
f7b0: 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f  e set .    ** co
f7c0: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
f7d0: 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  re NULL values, 
f7e0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
f7f0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78  of the.    ** ex
f800: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f  pression is also
f810: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
f820: 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
f830: 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66 46 61  l==0 || destIfFa
f840: 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
f850: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
f860: 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
f870: 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
f880: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74  ompile time that
f890: 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20 2a   the RHS.      *
f8a0: 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
f8b0: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
f8c0: 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68  is happens as th
f8d0: 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
f8e0: 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
f8f0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
f900: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
f910: 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ema..      **.  
f920: 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20      ** Also run 
f930: 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e  this branch if N
f940: 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ULL is equivalen
f950: 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20  t to FALSE.     
f960: 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72   ** for this par
f970: 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61  ticular IN opera
f980: 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tor..      */.  
f990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f9a0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
f9b0: 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
f9c0: 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
f9d0: 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20  lse, r1, 1);..  
f9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f9f0: 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68  * In this branch
fa00: 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  , the RHS of the
fa10: 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69   IN might contai
fa20: 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20  n a NULL and.   
fa30: 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e     ** the presen
fa40: 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20  ce of a NULL on 
fa50: 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20  the RHS makes a 
fa60: 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
fa70: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f  e.      ** outco
fa80: 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  me..      */.   
fa90: 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a     int j1, j2, j
faa0: 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 72  3;..      /* Fir
fab0: 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
fac0: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  if the LHS is co
fad0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
fae0: 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20  HS.  If so,.    
faf0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 72    ** then the pr
fb00: 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20  esence of NULLs 
fb10: 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 20  in the RHS does 
fb20: 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a  not matter, so j
fb30: 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ump.      ** ove
fb40: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
fb50: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a  e that follows..
fb60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
fb70: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
fb80: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
fb90: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
fba0: 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a  ble, 0, r1, 1);.
fbb0: 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65 20 77  .      /* Here w
fbc0: 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61 74 69  e begin generati
fbd0: 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  ng code that run
fbe0: 73 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  s if the LHS is 
fbf0: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  not.      ** con
fc00: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
fc10: 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61 74 65  e RHS.  Generate
fc20: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65   additional code
fc30: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
fc40: 65 73 74 73 20 74 68 65 20 52 48 53 20 66 6f 72  ests the RHS for
fc50: 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68 65 20   NULLs.  If the 
fc60: 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  RHS contains a N
fc70: 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  ULL then.      *
fc80: 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  * jump to destIf
fc90: 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20  Null.  If there 
fca0: 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20  are no NULLs in 
fcb0: 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20 20 20  the RHS then.   
fcc0: 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
fcd0: 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20 20 20  stIfFalse..     
fce0: 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d 20 73   */.      j2 = s
fcf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fd00: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
fd10: 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
fd20: 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33      j3 = sqlite3
fd30: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
fd40: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
fd50: 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 52 68  ->iTable, 0, rRh
fd60: 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20  sHasNull, 1);.  
fd70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fd80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
fd90: 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48 61 73  ger, -1, rRhsHas
fda0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
fdb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fdc0: 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 73  (v, j3);.      s
fdd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fde0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72  (v, OP_AddImm, r
fdf0: 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a  RhsHasNull, 1);.
fe00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe10: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
fe20: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
fe30: 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
fe40: 61 74 65 20 74 61 72 67 65 74 20 64 65 70 65 6e  ate target depen
fe50: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
fe60: 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  or not.      ** 
fe70: 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
fe80: 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2f   a NULL.      */
fe90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fea0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
feb0: 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  f, rRhsHasNull, 
fec0: 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
fed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fee0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
fef0: 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
ff00: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
ff10: 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68 65 20  OP_Found at the 
ff20: 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72 61 6e  top of this bran
ff30: 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20 77 68  ch jumps here wh
ff40: 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20 20 20  en true, .      
ff50: 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65 20 6f  ** causing the o
ff60: 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72 65 73  verall IN expres
ff70: 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20  sion evaluation 
ff80: 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  to fall through.
ff90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ffa0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ffb0: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
ffc0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
ffd0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
ffe0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
fff0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
10000 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 56  (pParse, 1);.  V
10010 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10020 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
10030 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10040 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10050 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69   */../*.** Dupli
10060 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76  cate an 8-byte v
10070 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  alue.*/.static c
10080 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56  har *dup8bytes(V
10090 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
100a0 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  ar *in){.  char 
100b0 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *out = sqlite3Db
100c0 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65  MallocRaw(sqlite
100d0 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a  3VdbeDb(v), 8);.
100e0 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
100f0 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c   memcpy(out, in,
10100 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   8);.  }.  retur
10110 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65  n out;.}..#ifnde
10120 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
10130 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
10140 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
10150 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
10160 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
10170 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
10180 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
10190 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
101a0 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
101b0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
101c0 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
101d0 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
101e0 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
101f0 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
10200 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
10210 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
10220 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
10230 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
10240 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
10250 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
10260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10270 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
10280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
10290 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
102a0 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
102b0 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
102c0 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
102d0 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  e;.    char *zV;
102e0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
102f0 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
10300 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
10310 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b  3IsNaN(value) );
10320 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46   /* The new AtoF
10330 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e   never returns N
10340 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  aN */.    if( ne
10350 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65  gateFlag ) value
10360 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a   = -value;.    z
10370 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
10380 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
10390 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
103a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61  AddOp4(v, OP_Rea
103b0 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  l, 0, iMem, 0, z
103c0 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  V, P4_REAL);.  }
103d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
103e0 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
103f0 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
10400 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
10410 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
10420 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
10430 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
10440 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
10450 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
10460 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
10470 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
10480 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
10490 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
104a0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
104b0 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
104c0 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
104d0 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
104e0 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
104f0 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
10500 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
10510 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10520 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
10530 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
10540 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
10550 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10560 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
10570 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
10580 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
10590 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
105a0 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
105b0 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
105c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
105d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
105e0 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
105f0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
10600 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  r *z = pExpr->u.
10610 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65  zToken;.    asse
10620 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
10630 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
10640 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65 67 46 6c  n64Bits(z, negFl
10650 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ag) ){.      i64
10660 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 63 68   value;.      ch
10670 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 73 71  ar *zV;.      sq
10680 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26  lite3Atoi64(z, &
10690 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  value);.      if
106a0 28 20 6e 65 67 46 6c 61 67 20 29 20 76 61 6c 75  ( negFlag ) valu
106b0 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
106c0 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
106d0 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
106e0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
106f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10700 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
10710 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36  , 0, zV, P4_INT6
10720 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  4);.    }else{.#
10730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10740 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
10750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10760 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10770 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
10780 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
10790 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
107a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 63 6f  ;.#else.      co
107b0 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
107c0 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23 65 6e  Flag, iMem);.#en
107d0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
107e0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63  ./*.** Clear a c
107f0 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ache entry..*/.s
10800 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65  tatic void cache
10810 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65  EntryClear(Parse
10820 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
10830 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a   yColCache *p){.
10840 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67    if( p->tempReg
10850 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
10860 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
10870 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
10880 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
10890 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
108a0 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
108b0 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67  Reg++] = p->iReg
108c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
108d0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a  empReg = 0;.  }.
108e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  }.../*.** Record
108f0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   in the column c
10900 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74  ache that a part
10910 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72  icular column fr
10920 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c  om a.** particul
10930 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  ar table is stor
10940 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  ed in a particul
10950 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ar register..*/.
10960 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
10970 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65  CacheStore(Parse
10980 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
10990 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  ab, int iCol, in
109a0 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
109b0 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a  ;.  int minLru;.
109c0 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20    int idxLru;.  
109d0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
109e0 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
109f0 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65  iReg>0 );  /* Re
10a00 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
10a10 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
10a20 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ve */.  assert( 
10a30 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c  iCol>=-1 && iCol
10a40 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69  <32768 );  /* Fi
10a50 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  nite column numb
10a60 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ers */..  /* The
10a70 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
10a80 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65  che flag disable
10a90 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  s the column cac
10aa0 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  he.  This is use
10ab0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69  d.  ** for testi
10ac0 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72  ng only - to ver
10ad0 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20  ify that SQLite 
10ae0 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20  always gets the 
10af0 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a  same answer.  **
10b00 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75   with and withou
10b10 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  t the column cac
10b20 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
10b30 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
10b40 20 26 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e   & SQLITE_Column
10b50 43 61 63 68 65 20 29 20 72 65 74 75 72 6e 3b 0a  Cache ) return;.
10b60 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c  .  /* First repl
10b70 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
10b80 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
10b90 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
10ba0 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  way the column c
10bb0 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c  ache is currentl
10bc0 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67  y used, we are g
10bd0 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74  uaranteed.  ** t
10be0 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77  hat the object w
10bf0 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64  ill never alread
10c00 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20  y be in cache.  
10c10 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72  Verify this guar
10c20 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e  antee..  */.#ifn
10c30 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72  def NDEBUG.  for
10c40 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
10c50 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
10c60 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
10c70 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 23 69 66 20 30  i++, p++){.#if 0
10c80 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 77 6f   /* This code wo
10c90 6c 64 20 72 65 6d 6f 76 65 20 74 68 65 20 65 6e  ld remove the en
10ca0 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63 61 63  try from the cac
10cb0 68 65 20 69 66 20 69 74 20 65 78 69 73 74 65 64  he if it existed
10cc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
10cd0 52 65 67 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  Reg && p->iTable
10ce0 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e 69 43 6f  ==iTab && p->iCo
10cf0 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20  lumn==iCol ){.  
10d00 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
10d10 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
10d20 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20        p->iLevel 
10d30 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
10d40 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  Level;.      p->
10d50 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
10d60 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
10d70 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
10d80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
10d90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10da0 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d  assert( p->iReg=
10db0 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21  =0 || p->iTable!
10dc0 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c  =iTab || p->iCol
10dd0 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d  umn!=iCol );.  }
10de0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69  .#endif..  /* Fi
10df0 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74  nd an empty slot
10e00 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
10e10 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  */.  for(i=0, p=
10e20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10e30 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
10e40 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
10e50 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
10e60 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  eg==0 ){.      p
10e70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
10e80 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
10e90 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20        p->iTable 
10ea0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d  = iTab;.      p-
10eb0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
10ec0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
10ed0 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e   iReg;.      p->
10ee0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
10ef0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
10f00 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
10f10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
10f20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
10f30 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
10f40 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
10f50 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
10f60 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
10f70 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
10f80 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
10f90 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
10fa0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
10fb0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
10fc0 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
10fd0 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
10fe0 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
10ff0 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
11000 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
11010 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
11020 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
11030 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
11040 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
11050 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
11060 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
11070 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
11080 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
11090 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
110a0 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
110b0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
110c0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
110d0 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
110e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
110f0 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
11100 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62  that registers b
11110 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65  etween iReg..iRe
11120 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69  g+nReg-1 are bei
11130 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
11140 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e  ** Purge the ran
11150 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
11160 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
11170 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cache..*/.void s
11180 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
11190 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  emove(Parse *pPa
111a0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
111b0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
111c0 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d  i;.  int iLast =
111d0 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31   iReg + nReg - 1
111e0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
111f0 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
11200 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
11210 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
11220 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
11230 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
11240 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
11250 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26    if( r>=iReg &&
11260 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20   r<=iLast ){.   
11270 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
11280 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
11290 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
112a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
112b0 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
112c0 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
112d0 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20   cache context. 
112e0 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73   Any new entries
112f0 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20   added.** added 
11300 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  to the column ca
11310 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63  che after this c
11320 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20  all are removed 
11330 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  when the.** corr
11340 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63  esponding pop oc
11350 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
11360 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
11370 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
11380 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  ){.  pParse->iCa
11390 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f  cheLevel++;.}../
113a0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
113b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
113c0 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
113d0 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
113e0 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
113f0 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f  revious N Push o
11400 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f  perations.  In o
11410 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74  ther words, rest
11420 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  ore the cache.**
11430 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
11440 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73   was in N Pushes
11450 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   ago..*/.void sq
11460 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
11470 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
11480 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69   int N){.  int i
11490 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
114a0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
114b0 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65  t( N>0 );.  asse
114c0 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
114d0 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20  heLevel>=N );.  
114e0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
114f0 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28  vel -= N;.  for(
11500 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11510 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11520 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11530 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11540 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
11550 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69  iLevel>pParse->i
11560 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20  CacheLevel ){.  
11570 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
11580 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
11590 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
115a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
115b0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
115c0 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
115d0 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
115e0 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
115f0 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
11600 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
11610 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
11620 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
11630 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
11640 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
11650 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
11660 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
11670 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
11680 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
11690 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
116a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
116b0 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
116c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
116d0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
116e0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
116f0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
11700 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
11710 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
11720 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
11730 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
11740 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
11750 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
11760 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
11770 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11780 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
11790 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
117a0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
117b0 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
117c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
117d0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
117e0 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
117f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
11800 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
11810 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
11820 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
11830 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
11840 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
11850 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
11860 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66   /* The cursor f
11870 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  or this table */
11880 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
11890 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
118a0 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
118b0 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
118c0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
118d0 72 61 63 74 20 74 68 65 20 76 61 6c 75 64 20 69  ract the valud i
118e0 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
118f0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43  r */.){.  if( iC
11900 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54  ol<0 || iCol==pT
11910 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
11920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11930 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
11940 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29  iTabCur, regOut)
11950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11960 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
11970 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
11980 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
11990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
119a0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
119b0 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65  TabCur, iCol, re
119c0 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
119d0 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
119e0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
119f0 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
11a00 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
11a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
11a20 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
11a30 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
11a40 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
11a50 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
11a60 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
11a70 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
11a80 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e   a register.  An
11a90 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61   effort.** is ma
11aa0 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
11ab0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
11ac0 72 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62  register iReg, b
11ad0 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f  ut this is.** no
11ae0 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54  t guaranteed.  T
11af0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
11b00 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
11b10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
11b20 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
11b30 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
11b40 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
11b50 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
11b60 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
11b70 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
11b80 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
11b90 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
11ba0 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
11bb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11bc0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
11bd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11be0 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
11bf0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
11c00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11c10 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
11c20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
11c30 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
11c40 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
11c50 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
11c60 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
11c70 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
11c80 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
11c90 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
11ca0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
11cb0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
11cc0 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
11cd0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
11ce0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
11cf0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
11d00 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
11d10 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
11d20 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
11d30 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11d40 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11d50 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
11d60 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11d70 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26  if( p->iReg>0 &&
11d80 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
11d90 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
11da0 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
11db0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
11dc0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
11dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11de0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
11df0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
11e00 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
11e10 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
11e20 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
11e30 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
11e40 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
11e50 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
11e60 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
11e70 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 73 71  umn, iReg);.  sq
11e80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
11e90 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
11ea0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
11eb0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  g);.  return iRe
11ec0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  g;.}../*.** Clea
11ed0 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
11ee0 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
11ef0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11f00 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
11f10 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
11f20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
11f30 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
11f40 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11f50 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
11f60 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
11f70 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
11f80 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20  f( p->iReg ){.  
11f90 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
11fa0 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
11fb0 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
11fc0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
11fd0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
11fe0 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
11ff0 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
12000 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
12010 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
12020 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
12030 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
12040 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12050 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
12060 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12070 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
12080 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
12090 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
120a0 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
120b0 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
120c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
120d0 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
120e0 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
120f0 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
12100 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
12110 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
12120 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
12130 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
12140 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12150 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
12160 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12170 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
12180 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
12190 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
121a0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69 66  olCache *p;.  if
121b0 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69  ( NEVER(iFrom==i
121c0 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  To) ) return;.  
121d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
121e0 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
121f0 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
12200 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66   iTo, nReg);.  f
12210 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12220 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12230 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12240 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12250 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67   int x = p->iReg
12260 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72  ;.    if( x>=iFr
12270 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52  om && x<iFrom+nR
12280 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  eg ){.      p->i
12290 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d  Reg += iTo-iFrom
122a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
122b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
122c0 64 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65  de to copy conte
122d0 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
122e0 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
122f0 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
12300 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
12310 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  1..*/.void sqlit
12320 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
12330 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12340 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
12350 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
12360 6e 74 20 69 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt i;.  if( NEVE
12370 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20  R(iFrom==iTo) ) 
12380 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
12390 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b  0; i<nReg; i++){
123a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
123b0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
123c0 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  Vdbe, OP_Copy, i
123d0 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a  From+i, iTo+i);.
123e0 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
123f0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
12400 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
12410 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
12420 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
12430 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
12440 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
12450 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
12460 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
12470 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
12480 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
12490 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
124a0 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
124b0 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
124c0 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
124d0 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
124e0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
124f0 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
12500 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
12510 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
12520 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12530 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
12540 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
12550 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
12560 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
12570 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
12580 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
12590 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
125a0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
125b0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
125c0 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
125d0 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
125e0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
125f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
12600 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12610 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
12620 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
12630 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  */../*.** Genera
12640 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
12650 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
12660 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
12670 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
12680 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
12690 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
126a0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
126b0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
126c0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
126d0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
126e0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
126f0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
12700 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
12710 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
12720 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
12730 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
12740 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
12750 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
12760 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
12770 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
12780 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
12790 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
127a0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
127b0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
127c0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
127d0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
127e0 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
127f0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
12800 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12810 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
12820 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
12830 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
12840 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
12850 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
12860 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
12870 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
12880 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
12890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
128a0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
128b0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
128c0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
128d0 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
128e0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
128f0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
12900 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
12910 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
12920 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
12930 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
12940 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
12950 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
12960 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
12970 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
12980 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
12990 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20  int r1, r2, r3, 
129a0 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72  r4;       /* Var
129b0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
129c0 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
129d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
129e0 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
129f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12a00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  */..  assert( ta
12a10 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
12a20 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
12a30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
12a40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
12a50 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
12a60 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
12a70 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
12a80 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
12a90 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
12aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
12ab0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
12ac0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
12ad0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
12ae0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
12af0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
12b00 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
12b10 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
12b20 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
12b30 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
12b40 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
12b50 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
12b60 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
12b70 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
12b80 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
12b90 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
12ba0 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
12bb0 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
12bc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12bd0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
12be0 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
12bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12c00 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
12c10 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
12c20 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
12c50 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
12c60 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
12c70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12c80 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
12c90 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
12ca0 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
12cb0 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
12cc0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
12cd0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
12ce0 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
12cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
12d00 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
12d10 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
12d20 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
12d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12d40 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
12d50 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
12d60 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
12d70 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
12d80 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
12d90 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
12da0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
12db0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
12dc0 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12df0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  Expr->iColumn, p
12e00 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
12e10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
12e20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12e30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
12e40 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
12e50 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
12e60 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  e, pExpr, 0, tar
12e70 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
12e80 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
12e90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
12ea0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
12eb0 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
12ec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
12ed0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
12ee0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
12ef0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
12f00 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
12f10 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
12f20 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
12f30 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
12f40 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
12f50 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
12f60 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
12f70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
12f80 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
12f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12fa0 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
12fb0 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c  8, 0, target, 0,
12fc0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
12fd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
12fe0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
12ff0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
13000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13010 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
13020 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
13030 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13040 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13050 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
13060 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
13070 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
13080 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
13090 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
130a0 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
130b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
130c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
130d0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
130e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
130f0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
13100 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
13110 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
13120 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13130 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
13140 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
13150 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
13160 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
13170 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
13180 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
13190 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
131a0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
131b0 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
131c0 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
131d0 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
131e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
131f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13200 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
13210 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
13220 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
13230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
13240 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
13250 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
13260 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
13270 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
13280 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
13290 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
132a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
132b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
132c0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
132d0 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
132e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
132f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
13300 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
13310 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
13320 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
13330 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
13340 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13350 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
13360 20 2d 31 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54   -1, pExpr->u.zT
13370 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
13380 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13390 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
133a0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
133b0 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
133c0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
133d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
133e0 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
133f0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
13400 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
13410 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
13420 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
13430 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13440 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13450 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
13460 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
13470 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
13480 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
13490 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
134a0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
134b0 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f      int aff, to_
134c0 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  op;.      inReg 
134d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
134e0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
134f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
13500 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  rget);.      ass
13510 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13520 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13530 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13540 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
13550 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
13560 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
13570 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66       to_op = aff
13580 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   - SQLITE_AFF_TE
13590 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a  XT + OP_ToText;.
135a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
135b0 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20  _op==OP_ToText  
135c0 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
135d0 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a  _AFF_TEXT    );.
135e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
135f0 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20  _op==OP_ToBlob  
13600 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
13610 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a  _AFF_NONE    );.
13620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
13630 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
13640 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45  c || aff!=SQLITE
13650 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
13660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
13670 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20  _op==OP_ToInt   
13680 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
13690 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
136a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
136b0 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20  _op==OP_ToReal  
136c0 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
136d0 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a  _AFF_REAL    );.
136e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
136f0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
13700 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13710 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
13720 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65  Blob );.      te
13730 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
13740 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20  P_ToNumeric );. 
13750 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
13760 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29  o_op==OP_ToInt )
13770 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13780 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
13790 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  al );.      if( 
137a0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b  inReg!=target ){
137b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
137c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
137d0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
137e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
137f0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
13800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13820 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29  v, to_op, inReg)
13830 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13840 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
13850 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
13860 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
13870 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
13880 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
13890 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
138a0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
138b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
138c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
138d0 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
138e0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
138f0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
13900 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
13910 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
13920 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
13930 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
13940 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
13950 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
13960 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
13970 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13980 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
13990 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
139a0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
139b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
139c0 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
139d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
139e0 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
139f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
13a00 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
13a10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13a20 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
13a30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
13a40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13a50 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
13a60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13a70 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
13a80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
13a90 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
13aa0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
13ab0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
13ac0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
13ad0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
13ae0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
13af0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
13b00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
13b10 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
13b20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
13b30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
13b40 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
13b50 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
13b60 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
13b70 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
13b80 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
13b90 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
13ba0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
13bb0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
13bc0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
13bd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13be0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
13bf0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
13c00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13c10 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
13c20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
13c30 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
13c40 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
13c50 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
13c60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
13c70 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
13c80 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
13c90 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
13ca0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
13cb0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
13cc0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
13cd0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
13ce0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
13cf0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
13d00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
13d10 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
13d20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
13d30 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
13d40 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
13d50 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  P2 | SQLITE_NULL
13d60 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
13d70 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
13d80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13d90 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
13da0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13db0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13dc0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
13dd0 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
13de0 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
13df0 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
13e00 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
13e10 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
13e20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
13e30 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
13e40 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
13e50 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
13e60 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
13e70 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
13e80 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
13e90 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
13ea0 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
13eb0 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
13ec0 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
13ed0 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
13ee0 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
13ef0 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
13f00 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
13f10 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
13f20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
13f30 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
13f40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13f50 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
13f60 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
13f70 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
13f80 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
13f90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
13fa0 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
13fb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13fc0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
13fd0 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
13fe0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
13ff0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
14000 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
14010 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
14020 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
14030 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14040 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
14050 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14060 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
14070 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
14080 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
14090 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
140a0 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
140b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
140c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
140d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
140e0 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
140f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
14100 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
14110 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
14120 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  H );.      testc
14130 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
14140 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
14150 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
14160 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
14170 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
14180 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
14190 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
141a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
141b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
141c0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
141d0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
141e0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
141f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
14200 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
14210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14220 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
14230 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14240 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14250 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14260 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14270 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
14280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14290 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
142a0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
142b0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
142c0 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
142d0 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
142e0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
142f0 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
14300 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
14310 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
14320 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66   1, target);.#if
14330 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14340 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
14350 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14360 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
14370 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
14380 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
14390 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
143a0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
143b0 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
143c0 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
143d0 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
143e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
143f0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46  se{.        regF
14400 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69  ree1 = r1 = sqli
14410 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14420 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
14430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14440 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14450 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  0, r1);.        
14460 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
14470 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14480 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14490 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
144a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
144b0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
144c0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
144d0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
144e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
144f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
14500 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
14510 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
14520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14530 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
14540 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
14550 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14560 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
14570 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
14580 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
14590 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
145a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
145b0 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
145c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
145d0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
145e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
145f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14600 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14610 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
14620 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14630 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
14640 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
14650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14660 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
14670 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
14680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14690 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
146a0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
146b0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
146c0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
146d0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
146e0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
146f0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
14700 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
14710 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14720 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
14730 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14740 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
14750 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14770 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
14780 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
14790 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
147a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
147b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
147c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
147d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
147e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
147f0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14800 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
14810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14820 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14830 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
14840 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
14850 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14860 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
14870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14880 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
14890 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
148a0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
148b0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
148c0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
148d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
148e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
148f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14900 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
14910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14920 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
14930 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
14940 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
14950 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
14960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14970 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
14980 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
14990 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
149a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
149b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
149c0 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
149d0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
149e0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
149f0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
14a00 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
14a10 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
14a20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
14a30 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
14a40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
14a50 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
14a60 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
14a70 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
14a80 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
14a90 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
14aa0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
14ab0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
14ac0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
14ad0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
14ae0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
14af0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14b00 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
14b10 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
14b20 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  /.      int cons
14b30 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
14b40 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
14b50 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
14b60 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
14b70 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
14ba0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
14bb0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
14bc0 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
14bd0 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
14be0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
14bf0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
14c00 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
14c10 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
14c20 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
14c30 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
14c40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
14c50 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
14c60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14c70 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29  =TK_CONST_FUNC )
14c80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14c90 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ( op==TK_FUNCTIO
14ca0 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
14cb0 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
14cc0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
14cd0 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
14ce0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
14cf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d00 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
14d10 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
14d20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
14d30 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
14d40 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
14d50 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14d60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14d70 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14d80 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
14d90 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
14da0 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33     nId = sqlite3
14db0 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20  Strlen30(zId);. 
14dc0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
14dd0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
14de0 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46  db, zId, nId, nF
14df0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
14e00 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
14e10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14e20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14e30 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
14e40 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e  tion: %.*s()", n
14e50 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
14e60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14e70 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
14e80 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
14e90 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
14ea0 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
14eb0 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
14ec0 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
14ed0 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
14ee0 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
14ef0 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20  evalation of.   
14f00 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
14f10 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
14f20 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
14f30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14f40 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73   if( pDef->flags
14f50 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
14f60 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20  OALESCE ){.     
14f70 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73     int endCoales
14f80 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
14f90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
14fb0 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20  arg>=2 );.      
14fc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14fd0 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
14fe0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
14ff0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  get);.        fo
15000 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=1; i<nFarg; 
15010 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15030 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
15040 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c   target, endCoal
15050 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  esce);.         
15060 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15070 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
15080 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
15090 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
150a0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
150b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
150c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
150d0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
150e0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
150f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15100 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
15110 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
15120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
15130 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15140 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
15150 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
15160 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  reak;.      }...
15170 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
15180 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  ){.        r1 = 
15190 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
151a0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
151b0 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
151c0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
151d0 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
151e0 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
151f0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
15200 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
15210 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
15220 70 46 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20  pFarg, r1, 1);. 
15230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15240 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
15250 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b  e, 1);   /* Tick
15260 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
15270 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
15280 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
15290 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
152a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
152b0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
152c0 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
152d0 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
152e0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
152f0 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
15300 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
15310 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
15320 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
15330 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
15340 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
15350 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
15360 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
15370 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
15380 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
15390 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
153a0 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
153b0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
153c0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
153d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
153e0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
153f0 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
15400 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
15410 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
15420 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
15430 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
15440 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
15450 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
15460 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
15470 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
15480 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
15490 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
154a0 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
154b0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
154c0 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
154d0 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
154e0 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
154f0 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
15500 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
15510 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
15520 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
15530 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
15540 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
15550 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
15560 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
15570 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
15580 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
15590 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
155a0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
155b0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
155c0 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
155d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
155e0 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
155f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
15600 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
15610 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
15620 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
15630 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
15640 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
15650 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
15660 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
15670 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
15680 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
15690 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
156a0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
156b0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
156c0 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
156d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
156e0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
156f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
15700 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
15710 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
15720 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
15730 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
15740 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
15750 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
15760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15770 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
15780 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
15790 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
157a0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
157b0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
157c0 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
157d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
157e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
157f0 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
15800 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
15810 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
15820 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
15830 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15840 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
15850 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
15860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15870 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
15880 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
15890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
158a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
158b0 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20  (u8)nFarg);.    
158c0 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b 0a 20    if( nFarg ){. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
158e0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
158f0 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67  Parse, r1, nFarg
15900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15910 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
15920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15930 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
15940 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
15950 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
15960 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
15970 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
15980 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
15990 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
159a0 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ECT );.      inR
159b0 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  eg = sqlite3Code
159c0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
159d0 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
159e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
159f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
15a00 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
15a10 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
15a20 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15a30 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
15a40 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
15a50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15a60 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
15a70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15a80 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
15a90 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
15aa0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
15ab0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
15ac0 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
15ad0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
15ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15af0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
15b00 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15b10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15b20 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
15b30 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73  fFalse);.      s
15b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15b50 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
15b60 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  arget, 0);.     
15b70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15b80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
15b90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
15ba0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
15bb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15bc0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
15bd0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
15be0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
15bf0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
15c00 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
15c10 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
15c20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
15c30 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
15c40 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
15c50 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
15c60 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
15c70 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
15c80 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
15c90 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
15ca0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
15cb0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
15cc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15cd0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
15ce0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
15cf0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
15d00 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
15d10 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
15d20 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  tem = pExpr->x.p
15d30 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
15d40 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
15d50 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
15d60 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15d70 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15d80 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
15d90 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
15da0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15db0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15dc0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
15dd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15de0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
15df0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15e00 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
15e10 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69  .      r3 = sqli
15e20 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15e30 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20  arse);.      r4 
15e40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15e50 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15e60 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
15e70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
15e80 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20  ight, OP_Ge,.   
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
15ea0 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54  1, r2, r3, SQLIT
15eb0 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
15ec0 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
15ed0 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
15ee0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
15ef0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15f00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
15f10 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72  gFree2);.      r
15f20 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15f30 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15f40 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
15f50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
15f60 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
15f70 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
15f80 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
15f90 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
15fa0 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53  e, r1, r2, r4, S
15fb0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
15fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15fd0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e  eAddOp3(v, OP_An
15fe0 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65  d, r3, r4, targe
15ff0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16000 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16010 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20  pParse, r3);.   
16020 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16030 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16040 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r4);.      brea
16050 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
16060 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
16070 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
16080 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16090 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
160a0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
160b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
160c0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
160d0 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
160e0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
160f0 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
16100 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
16110 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
16120 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
16130 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
16140 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
16150 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
16160 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
16170 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
16180 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
16190 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
161a0 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
161b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
161c0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
161d0 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
161e0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
161f0 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
16200 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
16210 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
16220 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
16230 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
16240 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
16250 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
16260 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
16270 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
16280 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
16290 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
162a0 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
162b0 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
162c0 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
162d0 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
162e0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
162f0 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
16300 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
16310 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
16320 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
16330 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
16340 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
16350 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
16360 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
16370 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
16380 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
16390 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
163a0 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
163b0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
163c0 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
163d0 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
163e0 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
163f0 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
16400 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
16410 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
16420 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
16430 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
16440 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
16450 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
16460 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
16470 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
16480 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
16490 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
164a0 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
164b0 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
164c0 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
164d0 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
164e0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
164f0 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
16500 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
16510 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
16520 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
16530 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
16540 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
16550 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
16560 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
16570 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
16580 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
16590 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
165a0 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
165b0 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
165c0 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
165d0 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
165e0 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
165f0 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
16600 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
16610 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
16620 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
16630 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
16640 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
16650 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
16660 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16670 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
16680 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
16690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
166a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
166b0 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
166c0 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
166d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
166e0 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
166f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
16700 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
16710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
16720 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
16730 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
16740 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16750 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
16760 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
16770 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
16780 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
16790 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
167a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
167b0 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
167c0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
167d0 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
167e0 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
167f0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
16800 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
16810 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
16820 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
16830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
16840 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
16850 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
16860 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
16870 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
16880 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
16890 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
168a0 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
168b0 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
168c0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
168d0 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a   really real.  *
168e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
168f0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
16900 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
16910 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
16920 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
16930 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
16940 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
16950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16960 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
16970 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
16980 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
169a0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
169b0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
169c0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
169d0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
169e0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
169f0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
16a00 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
16a10 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
16a20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
16a30 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
16a40 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
16a50 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
16a60 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
16a70 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
16a80 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
16a90 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
16aa0 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
16ab0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
16ac0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
16ad0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
16ae0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
16af0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
16b00 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
16b10 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
16b20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
16b30 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
16b40 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
16b50 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70      ** Y is in p
16b60 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54  Expr->pRight.  T
16b70 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
16b80 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65  ional.  If there
16b90 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c   is no.    ** EL
16ba0 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  SE clause and no
16bb0 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63   other term matc
16bc0 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  hes, then the re
16bd0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20  sult of the.    
16be0 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20  ** exprssion is 
16bf0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
16c00 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
16c10 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
16c20 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
16c30 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
16c40 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
16c50 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
16c60 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
16c70 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
16c80 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
16c90 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
16ca0 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
16cb0 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
16cc0 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
16cd0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
16ce0 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
16cf0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
16d00 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
16d10 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
16d20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
16d50 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
16d60 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
16d70 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
16da0 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
16db0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
16dc0 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16de0 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
16df0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
16e00 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16e30 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
16e40 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
16e70 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
16e80 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
16e90 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
16ea0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
16eb0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
16ec0 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
16ef0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
16f00 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58 3b      Expr cacheX;
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20        /* Cached 
16f30 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a  expression X */.
16f40 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
16f70 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
16f80 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
16f90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16fa0 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
16fb0 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
16fc0 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
16fd0 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
16fe0 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20  int iCacheLevel 
16ff0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
17000 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20  Level; )..      
17010 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
17020 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17030 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26  EP_xIsSelect) &&
17040 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
17050 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17060 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
17070 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
17080 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17090 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
170a0 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
170b0 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
170c0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
170d0 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
170e0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
170f0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
17100 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
17110 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
17120 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
17130 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
17140 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
17150 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  ){.        cache
17160 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
17170 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
17180 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
17190 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
171a0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ( pX->op==TK_REG
171b0 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
171c0 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d   cacheX.iTable =
171d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
171e0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c  Temp(pParse, pX,
171f0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
17200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17210 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
17220 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20        cacheX.op 
17230 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
17240 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
17250 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
17260 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
17270 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a  Left = &cacheX;.
17280 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
17290 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
172a0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33      /* Ticket b3
172b0 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39  51d95f9cd5ef17e9
172c0 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31  d9dbae18f5ca8611
172d0 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20  190001:.        
172e0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
172f0 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67  regFree1 might g
17300 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f  et SCopy-ed into
17310 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74   the file result
17320 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20  ..        ** So 
17330 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
17340 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69  he regFree1 regi
17350 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73  ster is not reus
17360 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20  ed for other.   
17370 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73       ** purposes
17380 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76   and possibly ov
17390 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
173a0 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
173b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
173c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
173d0 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
173e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
173f0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
17400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
17410 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
17420 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
17430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
17440 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
17450 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
17460 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
17470 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
17480 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
17490 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
174a0 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
174b0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
174c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
174d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
174e0 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
174f0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
17500 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
17510 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
17520 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
17530 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
17540 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17550 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
17560 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
17570 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
17580 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
17590 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
175a0 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
175b0 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  R );.        sql
175c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
175d0 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
175e0 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
175f0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
17600 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17610 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64   OP_Goto, 0, end
17620 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
17630 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
17640 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
17650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17660 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17670 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
17680 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17690 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
176a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
176b0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
176c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
176d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
176e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
176f0 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  ight, target);. 
17700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17710 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
17720 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e, 1);.      }el
17730 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
17740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17750 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
17760 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
17770 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17780 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
17790 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a  pParse->nErr>0 .
177a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
177b0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
177c0 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29  l==iCacheLevel )
177d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
177e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
177f0 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
17800 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17820 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
17830 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
17840 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17850 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
17860 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20  =OE_Rollback .  
17870 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
17880 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
17890 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20  Abort.          
178a0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
178b0 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ity==OE_Fail.   
178c0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
178d0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
178e0 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  gnore.      );. 
178f0 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
17900 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
17910 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17920 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17940 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
17950 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
17960 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
17970 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
17980 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
179a0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
179b0 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  y==OE_Abort ){. 
179c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
179d0 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
179e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
179f0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
17a00 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17a10 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
17a20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
17a30 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
17a40 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  re ){.        sq
17a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20  .            v, 
17a70 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
17a80 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30  OK, OE_Ignore, 0
17a90 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
17aa0 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n,0);.      }els
17ab0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
17ac0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
17ad0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17ae0 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
17af0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20  >u.zToken, 0);. 
17b00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
17b10 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
17b20 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
17b30 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17b40 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
17b50 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
17b60 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17b70 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
17b80 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
17b90 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17ba0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
17bb0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
17bc0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17bd0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
17be0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
17bf0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
17c00 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
17c10 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
17c20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
17c30 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
17c40 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
17c50 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
17c60 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
17c70 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
17c80 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
17c90 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
17ca0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
17cb0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
17cc0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
17cd0 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71   zero..*/.int sq
17ce0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17cf0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
17d00 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
17d10 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
17d20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
17d30 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17d40 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
17d50 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
17d60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
17d70 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72  r1);.  if( r2==r
17d80 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d  1 ){.    *pReg =
17d90 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   r1;.  }else{.  
17da0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17db0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17dc0 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d  r1);.    *pReg =
17dd0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
17de0 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
17df0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
17e00 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
17e10 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
17e20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
17e30 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
17e40 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
17e50 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
17e60 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
17e70 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
17e80 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74  r target..*/.int
17e90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17ea0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17eb0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
17ec0 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20   target){.  int 
17ed0 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74  inReg;..  assert
17ee0 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
17ef0 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
17f00 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  em );.  if( pExp
17f10 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  r && pExpr->op==
17f20 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
17f30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17f40 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
17f50 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78  be, OP_Copy, pEx
17f60 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67  pr->iTable, targ
17f70 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
17f80 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
17f90 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
17fa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
17fb0 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65  arget);.    asse
17fc0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
17fd0 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  e || pParse->db-
17fe0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
17ff0 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
18000 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
18010 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
18020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18030 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
18040 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
18050 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
18060 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  }.  }.  return t
18070 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arget;.}../*.** 
18080 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
18090 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  at evalutes the 
180a0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
180b0 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
180c0 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
180d0 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
180e0 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
180f0 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
18100 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
18110 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
18120 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
18130 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
18140 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
18150 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
18160 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
18170 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
18180 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
18190 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
181a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
181b0 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
181c0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
181d0 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
181e0 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
181f0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
18200 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
18210 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
18220 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
18230 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
18240 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
18250 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
18260 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
18270 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
18280 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
18290 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e  >pVdbe;.  int in
182a0 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73  Reg;.  inReg = s
182b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
182c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
182d0 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28  rget);.  assert(
182e0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f   target>0 );.  /
182f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18300 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72  s called for ter
18310 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20  ms to INSERT or 
18320 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65  UPDATE.  And the
18330 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72   only.  ** other
18340 20 70 6c 61 63 65 20 77 68 65 72 65 20 65 78 70   place where exp
18350 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
18360 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
18370 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20 20  K_REGISTER is.  
18380 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ** in WHERE clau
18390 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
183a0 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20  So as currently 
183b0 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65  implemented, the
183c0 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61  re is.  ** no wa
183d0 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53  y for a TK_REGIS
183e0 54 45 52 20 74 6f 20 65 78 69 73 74 20 68 65 72  TER to exist her
183f0 65 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d 73  e.  But it seems
18400 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a   prudent to.  **
18410 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59 53   keep the ALWAYS
18420 28 29 20 69 6e 20 63 61 73 65 20 74 68 65 20 63  () in case the c
18430 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
18440 63 68 61 6e 67 65 20 77 69 74 68 20 66 75 74 75  change with futu
18450 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  re.  ** modifica
18460 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65  tions or enhance
18470 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ments. */.  if( 
18480 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70  ALWAYS(pExpr->op
18490 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29  !=TK_REGISTER) )
184a0 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  {  .    int iMem
184b0 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  ;.    iMem = ++p
184c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
184d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
184e0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  p2(v, OP_Copy, i
184f0 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  nReg, iMem);.   
18500 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
18510 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72   iMem;.    pExpr
18520 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f  ->op2 = pExpr->o
18530 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  p;.    pExpr->op
18540 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
18550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52    }.  return inR
18560 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  eg;.}../*.** Ret
18570 75 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70  urn TRUE if pExp
18580 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74  r is an constant
18590 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
185a0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a   is appropriate.
185b0 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67  ** for factoring
185c0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20   out of a loop. 
185d0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70   Appropriate exp
185e0 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a  ressions are:.**
185f0 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78  .**    *  Any ex
18600 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76  pression that ev
18610 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f  aluates to two o
18620 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a  r more opcodes..
18630 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
18640 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52  OP_Integer, OP_R
18650 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  eal, OP_String, 
18660 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c  OP_Blob, OP_Null
18670 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f  , .**       or O
18680 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20  P_Variable that 
18690 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
186a0 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20   be placed in a 
186b0 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66  .**       specif
186c0 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  ic register..**.
186d0 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  ** There is no p
186e0 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e  oint in factorin
186f0 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73  g out single-ins
18700 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e  truction constan
18710 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  t.** expressions
18720 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
18730 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72   placed in a par
18740 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
18750 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  .  .** We could 
18760 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c  factor them out,
18770 20 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75   but then we wou
18780 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67  ld end up adding
18790 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20   an.** OP_SCopy 
187a0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d  instruction to m
187b0 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ove the value in
187c0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
187d0 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72  egister.** later
187e0 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77  .  We might as w
187f0 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65  ell just use the
18800 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75   original instru
18810 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f  ction and.** avo
18820 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e  id the OP_SCopy.
18830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
18840 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46  sAppropriateForF
18850 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70  actoring(Expr *p
18860 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  ){.  if( !sqlite
18870 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
18880 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20  otJoin(p) ){.   
18890 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f   return 0;  /* O
188a0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  nly constant exp
188b0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70  ressions are app
188c0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63  ropriate for fac
188d0 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  toring */.  }.  
188e0 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
188f0 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30  EP_FixedDest)==0
18900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
18910 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61  ;  /* Any consta
18920 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78  nt without a fix
18930 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  ed destination i
18940 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
18950 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
18960 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20  >op==TK_UPLUS ) 
18970 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
18980 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
18990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
189a0 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
189b0 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
189c0 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  OB:.#endif.    c
189d0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
189e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
189f0 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
18a00 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
18a10 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63  e TK_NULL:.    c
18a20 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
18a30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18a40 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20   p->op==TK_BLOB 
18a50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18a60 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  e( p->op==TK_VAR
18a70 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  IABLE );.      t
18a80 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
18a90 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  TK_INTEGER );.  
18aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
18ab0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b  >op==TK_FLOAT );
18ac0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18ad0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20   p->op==TK_NULL 
18ae0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18af0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  e( p->op==TK_STR
18b00 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  ING );.      /* 
18b10 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69  Single-instructi
18b20 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74  on constants wit
18b30 68 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  h a fixed destin
18b40 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20  ation are.      
18b50 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69  ** better done i
18b60 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66  n-line.  If we f
18b70 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79  actor them, they
18b80 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20   will just end. 
18b90 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72       ** up gener
18ba0 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70  ating an OP_SCop
18bb0 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61  y to move the va
18bc0 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69  lue to the desti
18bd0 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
18be0 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20  register. */.   
18bf0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18c00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
18c10 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
18c20 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  f( p->pLeft->op=
18c30 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e  =TK_FLOAT || p->
18c40 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
18c50 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
18c60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18c70 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
18c80 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
18c90 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  t: {.      break
18ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
18cb0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
18cc0 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
18cd0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
18ce0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
18cf0 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61  priate for.** fa
18d00 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
18d10 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c   loop, then eval
18d20 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
18d30 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  ion.** into a re
18d40 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65  gister and conve
18d50 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rt the expressio
18d60 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49  n into a TK_REGI
18d70 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69  STER.** expressi
18d80 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
18d90 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28  t evalConstExpr(
18da0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
18db0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
18dc0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
18dd0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
18de0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
18df0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
18e00 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73  e TK_IN:.    cas
18e10 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
18e20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
18e30 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
18e40 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
18e50 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
18e60 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
18e70 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
18e80 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f  _FUNC: {.      /
18e90 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * The arguments 
18ea0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  to a function ha
18eb0 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ve a fixed desti
18ec0 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  nation..      **
18ed0 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20   Mark them this 
18ee0 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e  way to avoid gen
18ef0 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20  erated unneeded 
18f00 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a  OP_SCopy.      *
18f10 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  * instructions. 
18f20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18f30 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
18f40 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18f50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18f60 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18f70 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
18f80 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
18f90 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
18fa0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
18fb0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
18fc0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18fd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
18fe0 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
18ff0 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d    for(; i>0; i--
19000 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19010 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
19020 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29  (pItem->pExpr) )
19030 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66   pItem->pExpr->f
19040 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64  lags |= EP_Fixed
19050 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dest;.        }.
19060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
19070 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
19080 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61   if( isAppropria
19090 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70  teForFactoring(p
190a0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
190b0 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r1 = ++pParse->
190c0 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32  nMem;.    int r2
190d0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
190e0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
190f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19100 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  r1);.    if( NEV
19110 45 52 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c  ER(r1!=r2) ) sql
19120 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19130 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
19140 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
19150 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
19160 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
19170 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78  EGISTER;.    pEx
19180 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b  pr->iTable = r2;
19190 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
191a0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
191b0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
191c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76  ;.}../*.** Preev
191d0 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20  aluate constant 
191e0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
191f0 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20  ithin pExpr and 
19200 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
19210 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
19220 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72  s.  Modify pExpr
19230 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
19240 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69  stant subexpresi
19250 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45  ons.** are TK_RE
19260 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74  GISTER opcodes t
19270 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
19280 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c   precomputed val
19290 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ues..*/.void sql
192a0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
192b0 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61  tants(Parse *pPa
192c0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
192d0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
192e0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
192f0 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72   = evalConstExpr
19300 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
19310 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70  lback = 0;.  w.p
19320 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
19330 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
19340 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
19350 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19360 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
19370 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
19380 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
19390 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
193a0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
193b0 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
193c0 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
193d0 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
193e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
193f0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
19400 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  ts evaluated..*/
19410 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
19420 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
19430 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19440 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
19450 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
19460 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
19470 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
19480 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
19490 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
194a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
194b0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
194c0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61  ts */.  int doHa
194d0 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61  rdCopy     /* Ma
194e0 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f  ke a hard copy o
194f0 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
19500 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
19510 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19520 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
19530 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
19540 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
19550 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
19560 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
19570 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Vdbe || pParse->
19580 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19590 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
195a0 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74  ->pVdbe==0 ) ret
195b0 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69  urn 0;.  n = pLi
195c0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
195d0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
195e0 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
195f0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
19600 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
19610 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  m->pExpr;.    in
19620 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65  t inReg = sqlite
19630 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
19640 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
19650 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66  arget+i);.    if
19660 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
19670 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
19680 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
19690 72 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f 48 61  rse->pVdbe, doHa
196a0 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f 70 79  rdCopy ? OP_Copy
196b0 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20   : OP_SCopy,.   
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 20 20 69 6e 52 65 67 2c 20 74 61 72 67       inReg, targ
196e0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  et+i);.    }.  }
196f0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
19700 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
19710 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
19720 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
19730 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
19740 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
19750 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
19760 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
19770 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
19780 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
19790 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
197a0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
197b0 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
197c0 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f  n.** elementatio
197d0 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69  n of x..*/.stati
197e0 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
197f0 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
19800 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
19810 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
19820 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19830 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
19840 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
19850 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
19860 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
19870 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
19880 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a  mp here if the j
19890 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  ump is taken */.
198a0 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65    int jumpIfTrue
198b0 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20  ,   /* Take the 
198c0 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
198d0 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  EEN is true */. 
198e0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
198f0 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
19900 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
19910 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
19920 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  .  Expr exprAnd;
19930 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
19940 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
19950 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
19960 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
19970 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
19980 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
19990 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
199a0 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
199b0 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b  */.  Expr exprX;
199c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78         /* The  x
199d0 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20    subexpression 
199e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
199f0 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
19a00 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
19a10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
19a20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19a30 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
19a40 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
19a50 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
19a60 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
19a70 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
19a80 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
19a90 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
19aa0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
19ab0 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
19ac0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
19ad0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
19ae0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
19af0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
19b00 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
19b10 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
19b20 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
19b30 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
19b40 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
19b50 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
19b60 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
19b70 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
19b80 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
19b90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
19ba0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
19bb0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78  &regFree1);.  ex
19bc0 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
19bd0 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70  STER;.  if( jump
19be0 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71  IfTrue ){.    sq
19bf0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
19c00 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
19c10 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19c20 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
19c30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
19c40 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
19c50 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
19c60 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
19c70 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19c80 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19c90 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
19ca0 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
19cb0 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
19cc0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
19cd0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
19ce0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
19cf0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
19d00 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
19d10 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
19d20 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
19d30 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
19d40 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
19d50 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
19d60 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
19d70 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
19d80 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
19d90 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
19da0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
19db0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
19dc0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
19dd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
19de0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
19df0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
19e00 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
19e10 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
19e20 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
19e30 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
19e40 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
19e50 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
19e60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
19e70 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
19e80 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
19e90 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
19ea0 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=0 );.}../*.**
19eb0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
19ec0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
19ed0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
19ee0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
19ef0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
19f00 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
19f10 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
19f20 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
19f30 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
19f40 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
19f50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
19f60 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
19f70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
19f80 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
19f90 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
19fa0 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
19fb0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
19fc0 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
19fd0 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
19fe0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
19ff0 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
1a000 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1a010 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
1a020 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
1a030 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
1a040 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
1a050 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
1a060 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
1a070 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
1a080 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
1a090 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
1a0a0 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
1a0b0 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
1a0c0 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
1a0d0 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
1a0e0 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
1a0f0 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
1a100 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
1a110 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
1a120 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1a130 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
1a140 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
1a150 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1a160 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
1a170 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1a180 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1a190 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1a1a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1a1b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1a1c0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1a1d0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1a1e0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1a1f0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1a200 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1a210 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1a220 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1a230 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1a240 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1a250 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
1a260 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
1a270 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1a280 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
1a290 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
1a2a0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
1a2b0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
1a2c0 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
1a2d0 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
1a2e0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1a2f0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1a300 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1a310 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a330 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1a340 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a350 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a360 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1a370 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1a380 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a390 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
1a3a0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1a3b0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1a3c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1a3d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a3e0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1a3f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1a400 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a410 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
1a420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a430 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1a440 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
1a450 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a460 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
1a470 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a480 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1a490 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1a4a0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1a4b0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1a4c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1a4d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a4e0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1a4f0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1a500 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1a510 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a520 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1a530 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1a540 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1a550 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1a560 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1a570 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a580 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1a590 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1a5a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a5b0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1a5c0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1a5d0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1a5e0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1a5f0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1a600 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1a610 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1a620 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
1a630 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
1a640 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
1a650 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
1a660 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
1a670 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
1a680 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
1a690 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
1a6a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a6b0 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
1a6c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a6d0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
1a6e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1a6f0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
1a700 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1a710 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
1a720 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1a730 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
1a740 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
1a750 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a760 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
1a770 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a780 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1a790 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1a7a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1a7b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a7c0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1a7d0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1a7e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a7f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a800 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1a810 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1a820 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1a830 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1a840 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1a870 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1a880 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1a890 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1a8a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1a8b0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1a8c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a8d0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1a8e0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1a8f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1a900 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
1a910 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1a920 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1a930 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1a940 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a950 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1a960 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1a970 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1a980 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1a990 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1a9a0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1a9b0 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
1a9c0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1a9d0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1a9e0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1a9f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1aa00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1aa10 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1aa20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1aa30 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  est, SQLITE_NULL
1aa40 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
1aa50 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1aa60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1aa70 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1aa80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1aa90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1aaa0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1aab0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1aac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1aad0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
1aae0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
1aaf0 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1ab00 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1ab10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ab20 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1ab30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ab40 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1ab50 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1ab60 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ab70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ab80 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1ab90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1aba0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1abb0 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1abc0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1abd0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1abe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1abf0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1ac00 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1ac10 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1ac20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1ac30 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1ac40 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1ac50 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1ac60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ac70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ac80 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
1ac90 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
1aca0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1acb0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
1acc0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
1acd0 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
1ace0 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
1acf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ad00 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1ad10 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1ad20 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1ad30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ad40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1ad50 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
1ad60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ad70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1ad80 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1ad90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ada0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1adb0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1adc0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1add0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
1ade0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1adf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae00 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
1ae10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ae20 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
1ae30 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1ae40 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1ae50 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ae60 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1ae70 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
1ae80 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1ae90 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1aea0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1aeb0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1aec0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1aed0 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
1aee0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1aef0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1af00 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1af10 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1af20 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1af30 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1af40 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
1af50 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1af60 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1af70 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1af80 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1af90 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
1afa0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1afb0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1afc0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1afd0 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
1afe0 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
1aff0 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
1b000 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
1b010 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
1b020 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
1b030 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b040 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
1b050 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1b060 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1b070 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1b080 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b090 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1b0a0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1b0b0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1b0c0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1b0d0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1b0e0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1b0f0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1b100 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1b110 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1b120 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1b130 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
1b140 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ance of VDBE che
1b150 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1b160 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
1b170 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
1b180 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1b190 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
1b1a0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
1b1b0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1b1c0 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
1b1d0 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
1b1e0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
1b1f0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
1b200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
1b210 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
1b220 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
1b230 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1b240 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
1b250 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
1b260 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
1b270 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
1b280 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1b2a0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
1b2b0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
1b2c0 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
1b2d0 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
1b2e0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
1b2f0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
1b300 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
1b310 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1b330 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
1b340 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
1b350 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
1b360 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
1b370 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
1b380 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
1b390 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1b3a0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
1b3b0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
1b3c0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
1b3d0 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
1b3e0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1b3f0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
1b400 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
1b410 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
1b420 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
1b430 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
1b440 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
1b450 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
1b460 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
1b470 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
1b480 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
1b490 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1b4a0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
1b4b0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1b4c0 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
1b4d0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1b4e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b4f0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
1b500 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
1b510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1b520 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
1b530 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
1b540 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1b550 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
1b560 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
1b570 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1b580 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
1b590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1b5a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
1b5b0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
1b5c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b5d0 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
1b5e0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
1b5f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1b600 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
1b610 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
1b620 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1b630 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1b640 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b650 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1b660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b670 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1b680 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1b690 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1b6a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b6b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1b6c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1b6d0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1b6e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1b6f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1b700 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1b710 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1b720 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1b730 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b740 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1b750 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1b760 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1b770 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1b780 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1b790 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1b7a0 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
1b7b0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1b7c0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1b7d0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1b7e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1b7f0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1b800 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1b810 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b820 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1b830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b840 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1b850 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1b860 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1b870 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1b880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1b890 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1b8a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b8b0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1b8c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1b8d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1b8e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b8f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1b900 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1b910 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1b920 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1b930 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1b940 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1b950 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
1b960 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
1b970 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b980 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
1b990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1b9a0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
1b9b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1b9c0 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
1b9d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1b9e0 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
1b9f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
1ba00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ba10 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1ba20 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1ba30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1ba40 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1ba50 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1ba60 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1ba70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ba80 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1ba90 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1baa0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1bab0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1bac0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1bad0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1bae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1baf0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1bb00 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1bb10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1bb20 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1bb30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1bb40 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1bb50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bb60 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1bb70 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1bb80 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1bb90 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1bba0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1bbb0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1bbc0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1bbd0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1bbe0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1bbf0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1bc00 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1bc10 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1bc20 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1bc30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bc40 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1bc50 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
1bc60 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
1bc70 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
1bc80 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1bc90 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1bca0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1bcb0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1bcd0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1bce0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1bcf0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1bd00 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1bd10 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1bd20 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1bd30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bd40 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1bd50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1bd60 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74  TNULL: {.      t
1bd70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1bd80 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1bd90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1bda0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1bdb0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1bdc0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1bdd0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1bde0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1bdf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1be00 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1be10 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1be20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1be30 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1be40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1be50 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1be60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1be70 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1be80 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1be90 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1bea0 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a  Expr, dest, 0, j
1beb0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1bec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bed0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1bee0 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
1bef0 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
1bf00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bf10 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1bf20 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
1bf30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bf40 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1bf50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
1bf60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1bf70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bf80 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1bf90 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
1bfa0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1bfb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1bfc0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1bfd0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1bfe0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1bff0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1c000 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
1c010 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c020 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1c030 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1c040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c050 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
1c060 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
1c070 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
1c080 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1c090 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1c0a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1c0b0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1c0c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c0d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1c0e0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c0f0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
1c100 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c110 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c120 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
1c130 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
1c140 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
1c150 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
1c160 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
1c170 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
1c180 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
1c190 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
1c1a0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
1c1b0 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
1c1c0 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
1c1d0 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
1c1e0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
1c1f0 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
1c200 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
1c210 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
1c220 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
1c230 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53  perator..**.** S
1c240 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
1c250 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c260 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
1c270 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
1c280 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
1c290 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
1c2a0 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
1c2b0 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
1c2c0 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
1c2d0 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
1c2e0 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
1c2f0 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
1c300 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
1c310 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
1c320 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
1c330 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
1c340 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
1c350 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1c360 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
1c370 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
1c380 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
1c390 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
1c3a0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1c3b0 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
1c3c0 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
1c3d0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1c3e0 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
1c3f0 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
1c400 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
1c410 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
1c420 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
1c430 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
1c440 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
1c450 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
1c460 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
1c470 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
1c480 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1c490 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1c4a0 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
1c4b0 72 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41  r *pB){.  if( pA
1c4c0 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
1c4d0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
1c4e0 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61  ? 0 : 2;.  }.  a
1c4f0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1c500 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  nyProperty(pA, E
1c510 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1c520 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73  educed) );.  ass
1c530 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1c540 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1c550 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1c560 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45  uced) );.  if( E
1c570 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c580 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  A, EP_xIsSelect)
1c590 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
1c5a0 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65  rty(pB, EP_xIsSe
1c5b0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
1c5c0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
1c5d0 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1c5e0 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
1c5f0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
1c600 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32  inct) ) return 2
1c610 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  ;.  if( pA->op!=
1c620 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
1c630 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  2;.  if( sqlite3
1c640 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1c650 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
1c660 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1c670 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1c680 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
1c690 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
1c6a0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1c6b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c6c0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
1c6d0 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
1c6e0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1c6f0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
1c700 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
1c710 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
1c720 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
1c730 32 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  2;.  if( ExprHas
1c740 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1c750 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  IntValue) ){.   
1c760 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
1c770 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74  perty(pB, EP_Int
1c780 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e  Value) || pA->u.
1c790 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56  iValue!=pB->u.iV
1c7a0 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
1c7b0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1c7c0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70  }else if( pA->op
1c7d0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
1c7e0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
1c7f0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1c800 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e  operty(pB, EP_In
1c810 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52  tValue) || NEVER
1c820 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30  (pB->u.zToken==0
1c830 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1c840 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1c850 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
1c860 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
1c870 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1c880 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
1c890 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
1c8a0 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
1c8b0 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
1c8c0 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29  EP_ExpCollate) )
1c8d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c8e0 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1c8f0 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20  _ExpCollate)!=0 
1c900 26 26 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42  && pA->pColl!=pB
1c910 2d 3e 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e  ->pColl ) return
1c920 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   2;.  return 0;.
1c930 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1c940 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
1c950 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
1c960 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
1c970 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
1c980 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
1c990 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
1c9a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1c9b0 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
1c9c0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
1c9d0 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
1c9e0 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
1c9f0 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
1ca00 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
1ca10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
1ca20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
1ca30 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
1ca40 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
1ca50 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
1ca60 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
1ca70 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
1ca80 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
1ca90 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
1caa0 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
1cab0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
1cac0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
1cad0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
1cae0 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
1caf0 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
1cb00 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1cb10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1cb20 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
1cb30 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
1cb40 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
1cb50 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d  if( pA==0 && pB=
1cb60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1cb70 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
1cb80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1cb90 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21    if( pA->nExpr!
1cba0 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  =pB->nExpr ) ret
1cbb0 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 1;.  for(i=0
1cbc0 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69  ; i<pA->nExpr; i
1cbd0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1cbe0 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d  ExprA = pA->a[i]
1cbf0 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
1cc00 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61   *pExprB = pB->a
1cc10 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
1cc20 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74  f( pA->a[i].sort
1cc30 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e  Order!=pB->a[i].
1cc40 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
1cc50 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 1;.    if( sq
1cc60 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1cc70 28 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29  (pExprA, pExprB)
1cc80 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
1cc90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1cca0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1ccb0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
1ccc0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1ccd0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
1cce0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1ccf0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
1cd00 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
1cd10 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
1cd20 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
1cd30 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
1cd40 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
1cd50 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
1cd60 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
1cd70 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
1cd80 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
1cd90 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
1cda0 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
1cdb0 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
1cdc0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
1cdd0 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
1cde0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
1cdf0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
1ce00 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
1ce10 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
1ce20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
1ce30 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
1ce40 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1ce50 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
1ce60 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
1ce70 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1ce80 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
1ce90 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
1cea0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1ceb0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
1cec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ced0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
1cee0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
1cef0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
1cf00 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
1cf10 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
1cf20 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1cf30 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
1cf40 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
1cf50 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
1cf60 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
1cf70 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
1cf80 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
1cf90 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
1cfa0 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
1cfb0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
1cfc0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
1cfd0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
1cfe0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
1cff0 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
1d000 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
1d010 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
1d020 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1d030 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
1d040 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1d050 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
1d060 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1d070 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
1d080 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
1d090 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
1d0a0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
1d0b0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
1d0c0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
1d0d0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
1d0e0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
1d0f0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
1d100 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
1d110 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
1d120 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
1d130 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
1d140 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
1d150 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1d160 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1d170 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
1d180 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
1d190 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
1d1a0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1d1b0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1d1c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d1d0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1d1e0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1d1f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1d200 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
1d210 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
1d220 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
1d230 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
1d240 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
1d250 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
1d260 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
1d270 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  cList!=0) ){.   
1d280 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1d290 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1d2a0 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
1d2b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1d2c0 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
1d2d0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1d2e0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
1d2f0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1d300 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Col;.          a
1d310 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1d320 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
1d330 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1d340 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
1d350 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1d360 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
1d370 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
1d380 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1d390 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1d3a0 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
1d3b0 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
1d3c0 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
1d3d0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
1d3e0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1d3f0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
1d400 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
1d410 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
1d420 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
1d430 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
1d440 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
1d450 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
1d460 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
1d470 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
1d480 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
1d490 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
1d4a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1d4b0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
1d4c0 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
1d4d0 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
1d4e0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
1d4f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1d500 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
1d510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d520 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
1d530 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
1d540 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1d550 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
1d560 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
1d570 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
1d580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d5a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d5b0 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
1d5c0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
1d5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
1d5e0 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
1d5f0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
1d600 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
1d610 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
1d620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1d630 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1d640 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
1d650 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
1d660 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
1d670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d680 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
1d690 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1d6b0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
1d6c0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1d6d0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1d6e0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1d6f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
1d700 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1d710 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1d730 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
1d740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d750 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
1d760 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
1d770 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
1d780 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
1d790 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
1d7a0 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
1d7b0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
1d7c0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
1d7d0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
1d7e0 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
1d800 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1d820 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
1d830 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1d850 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
1d860 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1d870 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
1d880 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1d890 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
1d8a0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
1d8d0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
1d8e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d8f0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1d900 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d970 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
1d980 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1d990 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1d9a0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
1d9b0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
1d9c0 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d9e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d9f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
1da00 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
1da10 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
1da20 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
1da30 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
1da40 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
1da50 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
1da60 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
1da70 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
1da80 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
1da90 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
1daa0 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
1dab0 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
1dac0 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
1dad0 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
1dae0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
1daf0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1db00 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
1db10 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
1db20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1db30 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
1db40 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
1db50 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1db60 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
1db70 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
1db80 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
1db90 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
1dba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dbb0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
1dbc0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1dbd0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
1dbe0 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
1dbf0 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
1dc00 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
1dc10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1dc20 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1dc30 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1dc40 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1dc50 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65   /* The pNC->nDe
1dc60 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73  pth==0 test caus
1dc70 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1dc80 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65  ctions in subque
1dc90 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ries.      ** to
1dca0 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20   be ignored */. 
1dcb0 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
1dcc0 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
1dcd0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1dce0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
1dcf0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
1dd00 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
1dd10 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
1dd20 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
1dd30 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
1dd40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
1dd50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dd60 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1dd70 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
1dd80 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
1dd90 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1dda0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1ddb0 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
1ddc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1ddd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1dde0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
1ddf0 2c 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20  , pExpr)==0 ){. 
1de00 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1de10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1de20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1de30 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
1de40 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
1de50 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
1de60 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
1de70 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
1de80 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
1de90 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1dea0 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
1deb0 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
1dec0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
1ded0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
1dee0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
1def0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
1df00 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
1df10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1df20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1df30 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1df40 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
1df50 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
1df60 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
1df70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1df80 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
1df90 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1dfa0 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
1dfb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1dfc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dfd0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1dfe0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1dff0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e000 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
1e010 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
1e020 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
1e030 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
1e040 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
1e050 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33  .zToken, sqlite3
1e060 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
1e070 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20  u.zToken),.     
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e090 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
1e0a0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1e0b0 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
1e0c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1e0d0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
1e0e0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
1e0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1e100 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
1e110 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1e120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1e130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1e140 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
1e150 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
1e160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e170 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1e180 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
1e190 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
1e1a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
1e1b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
1e1c0 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
1e1d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e1e0 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
1e1f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
1e200 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1e210 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
1e220 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
1e230 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
1e240 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
1e250 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
1e260 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
1e270 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
1e280 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1e290 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
1e2a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e2b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1e2c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
1e2d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
1e2e0 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
1e2f0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1e300 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43  Select){.  NameC
1e310 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
1e320 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
1e330 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
1e340 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e  =0 ){.    pNC->n
1e350 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c  Depth++;.    sql
1e360 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1e370 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29  Walker, pSelect)
1e380 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  ;.    pNC->nDept
1e390 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h--;.    return 
1e3a0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c  WRC_Prune;.  }el
1e3b0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  se{.    return W
1e3c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
1e3d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
1e3e0 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
1e3f0 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
1e400 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
1e410 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
1e420 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
1e430 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
1e440 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
1e450 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
1e460 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
1e470 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
1e480 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1e490 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
1e4a0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
1e4b0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
1e4c0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
1e4d0 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
1e4e0 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
1e4f0 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
1e500 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
1e510 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
1e520 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1e530 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
1e540 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
1e550 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
1e560 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
1e570 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
1e580 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
1e590 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1e5a0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
1e5b0 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
1e5c0 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
1e5d0 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
1e5e0 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
1e5f0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
1e600 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
1e610 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
1e620 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1e630 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
1e640 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
1e650 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1e660 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
1e670 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1e680 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
1e690 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
1e6a0 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
1e6b0 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
1e6c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
1e6d0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
1e6e0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1e6f0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1e700 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1e710 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1e720 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1e730 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1e740 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1e750 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1e760 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
1e770 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1e780 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1e790 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
1e7a0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
1e7b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1e7c0 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
1e7d0 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
1e7e0 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
1e7f0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
1e800 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
1e810 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1e820 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1e830 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
1e840 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
1e850 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
1e860 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
1e870 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
1e880 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
1e890 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
1e8a0 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
1e8b0 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
1e8c0 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
1e8d0 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
1e8e0 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
1e8f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
1e900 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
1e910 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
1e920 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1e930 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61  , then.** the da
1e940 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
1e950 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
1e960 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
1e970 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
1e980 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
1e990 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
1e9a0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
1e9b0 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
1e9c0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1e9d0 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
1e9e0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1e9f0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
1ea00 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
1ea10 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1ea20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1ea30 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
1ea40 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1ea50 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1ea60 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1ea70 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1ea80 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1ea90 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
1eaa0 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
1eab0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1eac0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
1ead0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1eae0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1eaf0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
1eb00 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
1eb10 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
1eb20 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
1eb30 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
1eb40 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
1eb50 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
1eb60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1eb70 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
1eb80 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
1eb90 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
1eba0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
1ebb0 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
1ebc0 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
1ebd0 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
1ebe0 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
1ebf0 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
1ec00 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
1ec10 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
1ec20 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1ec30 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
1ec40 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
1ec50 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
1ec60 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1ec70 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
1ec80 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
1ec90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
1eca0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1ecb0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
1ecc0 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
1ecd0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1ece0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
1ecf0 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
1ed00 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1ed10 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
1ed20 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
1ed30 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
1ed40 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
1ed50 0a 20 20 7d 0a 7d 0a                             .  }.}.