/ Hex Artifact Content
Login

Artifact 942171222a30af8cf4f9504a43ef6cadaf993dae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
0c10: 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  op;.    pColl = 
0c20: 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  p->pColl;.    if
0c30: 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ( pColl ) break;
0c40: 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  .    op = p->op;
0c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
0c60: 21 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  !=0 && (.       
0c70: 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55   op==TK_AGG_COLU
0c80: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c  MN || op==TK_COL
0c90: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  UMN || op==TK_RE
0ca0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
0cb0: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 29 29 7b  _TRIGGER.    )){
0cc0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
0cd0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0ce0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0cf0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0d00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
0d10: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0d20: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0d30: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0d40: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0d50: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ster */.      co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
0d80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
0d90: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
0da0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
0db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0dc0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70         zColl = p
0dd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0de0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0df0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0e00: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0e10: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0e20: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
0e30: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
0e60: 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26  f( op!=TK_CAST &
0e70: 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29  & op!=TK_UPLUS )
0e80: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
0e90: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
0ea0: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
0eb0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0ec0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0ed0: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0ee0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0ef0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0f00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
0f10: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
0f20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0f30: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
0f40: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0f50: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
0f60: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
0f70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
0f80: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0f90: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0fa0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
0fb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0fc0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
0fd0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0fe0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
0ff0: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1000: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1010: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1020: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
1030: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
1040: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
1050: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
1060: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
1070: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1080: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1090: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
10a0: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
10b0: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
10c0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
10d0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
10e0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
10f0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1100: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1120: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
1130: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1160: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
1170: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1180: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1190: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11a0: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
11b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
11c0: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
11d0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
11e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
11f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1200: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1210: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
1220: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
1230: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
1240: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1250: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
1260: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
1270: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1290: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
12a0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
12b0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
12c0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
12d0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
12e0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
12f0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1300: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1310: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1320: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
1330: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
1340: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
1350: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1360: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
1370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1380: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1390: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
13a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
13b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
13c0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
13d0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
13e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
13f0: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1400: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1410: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1430: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
1440: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1450: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
1460: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
1470: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1480: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1490: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
14b0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
14c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
14f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1500: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1510: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
1520: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
1530: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
1540: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
1550: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
1560: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
1570: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1580: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1590: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
15a0: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
15b0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
15c0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
15d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
15e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
15f0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1600: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1610: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
1620: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
1630: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1640: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
1650: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
1660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1670: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1680: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1690: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
16a0: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
16b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
16c0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
16d0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
16e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1700: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1710: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
1720: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
1730: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1740: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
1750: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1760: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
1770: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1780: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a0: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
17b0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
17c0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
17d0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
17e0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
17f0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1800: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1810: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1820: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1830: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1840: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1850: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1860: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1870: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1880: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1890: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
18a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
18b0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
18c0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
18d0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1910: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1920: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1930: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1940: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1950: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1960: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1970: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1980: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1990: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19a0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
19b0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
19c0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
19d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
19e0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
19f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1a00: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1a10: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1a20: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1a30: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1a40: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1a50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1a60: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1a70: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1a80: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1a90: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1aa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1ab0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1ac0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ad0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1af0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1b00: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1b10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b20: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1b40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1b50: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b60: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1b70: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1b80: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1b90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ba0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1bb0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1bc0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1bd0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1be0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1c10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1c20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1c30: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1c40: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1c50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1c90: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1ca0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1cc0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1cd0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cf0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1d00: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1d10: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1d20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1d30: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d50: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1d80: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1d90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1da0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1db0: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
1dc0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1dd0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
1de0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1df0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e00: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
1e10: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1e20: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
1e30: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
1e40: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
1e50: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
1e60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
1e70: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
1e80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1e90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1ea0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1eb0: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
1ec0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
1ed0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
1ee0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
1f10: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
1f20: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
1f50: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
1f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f70: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
1f80: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
1f90: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1fa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1fb0: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1fc0: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fd0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fe0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1ff0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2010: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2020: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2030: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2040: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2060: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2080: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
20b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
20c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20e0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20f0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2100: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2110: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2120: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2130: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2140: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2150: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2180: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
21a0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
21b0: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
21c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21d0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21e0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2200: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2210: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2220: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2230: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2240: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2250: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2260: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2270: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2280: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2290: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22a0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
22b0: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
22c0: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22d0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22e0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22f0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2310: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2340: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2350: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2360: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2370: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2380: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2390: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
23a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
23c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2400: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2410: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2440: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2450: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2460: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24a0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
24b0: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
24c0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24d0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24e0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24f0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2500: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2510: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2520: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2530: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2540: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2550: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2560: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2570: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2580: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2590: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
25a0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
25b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
25c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25d0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2600: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2610: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2620: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2630: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2640: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2650: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2660: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2670: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2680: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2690: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
26a0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
26b0: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
26c0: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26d0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2700: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2710: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2720: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2730: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2740: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2760: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2770: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2780: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2790: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
27a0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
27b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
27c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27e0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27f0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2800: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2810: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2820: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2830: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2840: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2850: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2860: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2870: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2880: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2890: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
28a0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
28b0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
28c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28d0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28e0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28f0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2910: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2920: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2940: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2950: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2960: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2970: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2980: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2990: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
29a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
29c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2a10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2a20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a70: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a80: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a90: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2aa0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2ab0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2ac0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ad0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ae0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2af0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2b00: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2b10: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2b20: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ba0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2bb0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2bc0: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2bd0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2be0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bf0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2c00: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2c10: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2c20: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c30: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c40: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c50: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c60: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c70: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c80: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c90: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2ca0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2cb0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2cc0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2cd0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cf0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2d00: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2d10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2d20: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d30: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d40: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d50: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d60: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d70: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d80: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d90: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2da0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2db0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2dc0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2dd0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2de0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2df0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2e00: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2e10: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2e20: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e30: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e40: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e50: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e60: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e80: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ea0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2eb0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ee0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ef0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2f00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2f10: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2f20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f30: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f50: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f60: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f70: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f80: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2fa0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2fb0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2fc0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fd0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fe0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2ff0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3000: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3010: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3020: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3060: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3070: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3080: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3090: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
30a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
30b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
30d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
30e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
30f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3100: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3110: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3130: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3140: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3150: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3160: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3170: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3180: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3190: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31a0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
31b0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
31c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
31d0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31e0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31f0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3200: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3210: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3220: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3230: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3240: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3250: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3260: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3280: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3290: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
32a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
32b0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
32c0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
32d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32e0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32f0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3300: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3310: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3330: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3340: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3350: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3360: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3370: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3380: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3390: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
33a0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
33b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
33d0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33f0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3400: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3420: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3440: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3450: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3460: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3470: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3480: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3490: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
34a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34b0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
34c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
34d0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34e0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34f0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3500: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3510: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3520: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3530: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3540: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3550: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3560: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3570: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3580: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3590: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
35a0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
35b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
35c0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
35d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35e0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3600: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3610: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3640: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3650: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3670: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3680: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3690: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
36a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
36b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
36c0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
36d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36e0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36f0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3700: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3730: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3750: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3760: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3780: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3790: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
37a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
37b0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
37c0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
37d0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37e0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37f0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3800: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3820: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3830: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3840: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3850: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3860: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3870: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3880: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3890: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
38a0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
38b0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
38c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
38d0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38e0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38f0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3900: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3910: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3920: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3940: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3950: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3960: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3970: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3980: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3990: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
39a0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
39b0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
39c0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
39d0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39e0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39f0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3a00: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3a10: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3a20: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
3a30: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
3a40: 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b   op, pToken, 1);
3a50: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  .  sqlite3ExprAt
3a60: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3a70: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3a80: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 69 66  t, pRight);.  if
3a90: 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  ( p ) {.    sqli
3aa0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
3ab0: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
3ac0: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65  eight);.  }.  re
3ad0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3ae0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3af0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3b00: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3b10: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3b20: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3b30: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3b40: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3b50: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
3b60: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
3b70: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3b80: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
3b90: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
3ba0: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
3bb0: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
3bc0: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
3bd0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3be0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeft;.  }else{.
3bf0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
3c00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3c10: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
3c20: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3c30: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3c40: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
3c50: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
3c60: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
3c70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
3c80: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
3c90: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
3ca0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
3cb0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
3cc0: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
3cd0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
3ce0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
3cf0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
3d00: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
3d10: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
3d20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3d30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
3d40: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
3d50: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3d60: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
3d70: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
3d80: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
3d90: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
3da0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3db0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
3dc0: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
3dd0: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
3de0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
3df0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
3e00: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
3e10: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
3e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
3e30: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
3e40: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
3e50: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
3e60: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
3e70: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3e80: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
3e90: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
3ea0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
3eb0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
3ec0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
3ed0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
3ee0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
3ef0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
3f00: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
3f10: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
3f20: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
3f30: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
3f40: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
3f50: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f60: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
3f70: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
3f80: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
3f90: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
3fa0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
3fb0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
3fc0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
3fd0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
3fe0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
3ff0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
4000: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
4010: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
4020: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4030: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4040: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4050: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4060: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4070: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4080: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4090: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
40a0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
40b0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
40c0: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
40d0: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
40e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
40f0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
4100: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
4110: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
4120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4130: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
4140: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4150: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
4160: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
4170: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4180: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
4190: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
41a0: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
41b0: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
41c0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
41d0: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
41e0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
41f0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
4200: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
4210: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20  if( z[1]==0 ){. 
4220: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4230: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
4240: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
4250: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4260: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
4270: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20  z[0]=='?' );.   
4280: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4290: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
42a0: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c  se->nVar);.  }el
42b0: 73 65 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20  se{.    ynVar x 
42c0: 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d  = 0;.    u32 n =
42d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
42e0: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  (z);.    if( z[0
42f0: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
4300: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
4310: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
4320: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
4330: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
4340: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74  .      ** use it
4350: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
4360: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
4370: 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e   i64 i;.      in
4380: 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74  t bOk = 0==sqlit
4390: 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20  e3Atoi64(&z[1], 
43a0: 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f  &i, n-1, SQLITE_
43b0: 55 54 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78  UTF8);.      pEx
43c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
43d0: 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20  = (ynVar)i;.    
43e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
43f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4400: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
4410: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
4420: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4430: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4440: 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20  NUMBER]-1 );.   
4450: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
4460: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4470: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4480: 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20  _NUMBER] );.    
4490: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20    if( bOk==0 || 
44a0: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
44b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
44c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
44d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
44e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
44f0: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
4500: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
4510: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
4520: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ",.            d
4530: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4540: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4550: 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20  NUMBER]);.      
4560: 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    x = 0;.      }
4570: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 70 50 61  .      if( i>pPa
4580: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
4590: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
45a0: 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20  r = (int)i;.    
45b0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
45c0: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
45d0: 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22  s like ":aaa", "
45e0: 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e  $aaa" or "@aaa".
45f0: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
4600: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
4610: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
4620: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
4630: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
4640: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
4650: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  me.      ** has 
4660: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
4670: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
4680: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
4690: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20  umber.      */. 
46a0: 20 20 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20       ynVar i;.  
46b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
46c0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b  Parse->nzVar; i+
46d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
46e0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d  pParse->azVar[i]
46f0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 61 72 73   && memcmp(pPars
4700: 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a 2c 6e 2b  e->azVar[i],z,n+
4710: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
4720: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
4730: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
4740: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
4750: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
4760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4770: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
4780: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4790: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
47a0: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
47b0: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
47c0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
47d0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
47e0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
47f0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
4800: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
4810: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
4820: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
4830: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65     if( a==0 ) re
4840: 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20  turn;  /* Error 
4850: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
4860: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4870: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61  d */.        pPa
4880: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
4890: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
48a0: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
48b0: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
48c0: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
48d0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
48e0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
48f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4900: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
4910: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
4920: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
4930: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4940: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4950: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
4960: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
4970: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
4980: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
4990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
49a0: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
49b0: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
49c0: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
49d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
49e0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
49f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4a10: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
4a20: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
4a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4a40: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4a50: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4a60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4a70: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4a80: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4a90: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4aa0: 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  urn;.  /* Sanity
4ab0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
4ac0: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
4ad0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
4ae0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
4af0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
4b00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4b10: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
4b20: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
4b30: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
4b40: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
4b50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
4b60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4b70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66  lete(db, p->pLef
4b80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4b90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4ba0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
4bb0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
4bc0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
4bd0: 29 20 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20  ) && (p->flags2 
4be0: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
4bf0: 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
4c00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4c10: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
4c20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45  .    }.    if( E
4c30: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4c40: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
4c50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4c60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4c70: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
4c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4ca0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
4cb0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
4cc0: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
4cd0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
4ce0: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
4cf0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4d00: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
4d10: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
4d20: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
4d30: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
4d40: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
4d50: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
4d60: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4d70: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
4d80: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
4d90: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
4da0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
4db0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
4dc0: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
4dd0: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
4de0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
4df0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4e00: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
4e10: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
4e20: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
4e30: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4e40: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
4e50: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
4e60: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
4e70: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
4e80: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
4e90: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
4ea0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
4eb0: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
4ec0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
4ed0: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
4ee0: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
4ef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
4f00: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
4f10: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
4f20: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
4f30: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
4f40: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
4f50: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
4f60: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
4f70: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
4f80: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
4f90: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
4fa0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
4fb0: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
4fc0: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
4fd0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
4fe0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
4ff0: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
5000: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
5010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5060: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5070: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5080: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5090: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
50a0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
50b0: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
50c0: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
50d0: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
50e0: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
50f0: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
5100: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
5110: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
5120: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
5130: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5140: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5150: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5160: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5170: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5180: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5190: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
51a0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
51b0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
51c0: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
51d0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
51e0: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
51f0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
5200: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
5210: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
5220: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
5230: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5240: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5250: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5260: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5270: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5280: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5290: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
52a0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
52b0: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
52c0: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
52d0: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
52e0: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
52f0: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
5300: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
5310: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
5320: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
5330: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5340: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5350: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5360: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5370: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5380: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5390: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
53a0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
53b0: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
53c0: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
53d0: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
53e0: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
53f0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
5400: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
5410: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
5420: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
5430: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5440: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5450: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5460: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5470: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5480: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5490: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
54a0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
54b0: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
54c0: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
54d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
54e0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
54f0: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
5500: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
5510: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5520: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5530: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5540: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5550: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5560: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5570: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5580: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5590: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69  e allowed */.  i
55a0: 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50  f( 0==(flags&EXP
55b0: 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a  RDUP_REDUCE) ){.
55c0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
55d0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
55e0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
55f0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
5600: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
5610: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
5620: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
5630: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5640: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
5650: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
5660: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5670: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d  _MallocedToken)=
5680: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
5690: 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  ( (p->flags2 & E
56a0: 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d  P2_Irreducible)=
56b0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
56c0: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69  >pLeft || p->pRi
56d0: 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20  ght || p->pColl 
56e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
56f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
5700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
5720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
5730: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
5740: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5750: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
5760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
5770: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
5780: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
5790: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
57a0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
57b0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
57c0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
57d0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
57e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
57f0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
5800: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
5810: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
5820: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
5830: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5840: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5850: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5860: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
5870: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
5880: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
5890: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
58a0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
58b0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
58c0: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
58d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
58e0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
58f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
5900: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
5910: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5920: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5930: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
5940: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
5950: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
5960: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
5970: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5980: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
5990: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
59a0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
59b0: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
59c0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
59d0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
59e0: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
59f0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
5a00: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
5a10: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
5a20: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
5a30: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
5a40: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
5a50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
5a60: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
5a70: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
5a80: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
5a90: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
5aa0: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
5ab0: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
5ac0: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
5ad0: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
5ae0: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
5af0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
5b00: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
5b10: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
5b20: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
5b30: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
5b40: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
5b50: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
5b60: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
5b70: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5b80: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
5b90: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
5ba0: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
5bb0: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
5bc0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5bd0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
5be0: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
5bf0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
5c00: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
5c10: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
5c20: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
5c30: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
5c40: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
5c50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5c60: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
5c70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5c80: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
5c90: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
5ca0: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
5cb0: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
5cc0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
5cd0: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
5ce0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
5cf0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
5d00: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
5d10: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
5d20: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
5d30: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
5d40: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
5d50: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
5d60: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
5d70: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
5d80: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
5d90: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
5da0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
5db0: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
5dc0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
5dd0: 74 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a  te passed the.**
5de0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5df0: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
5e00: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
5e10: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
5e20: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
5e30: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
5e40: 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38  p, int flags, u8
5e50: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
5e60: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20  Expr *pNew = 0; 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
5e90: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28   return */.  if(
5ea0: 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   p ){.    const 
5eb0: 69 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20  int isReduced = 
5ec0: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
5ed0: 45 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a  EDUCE);.    u8 *
5ee0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20  zAlloc;.    u32 
5ef0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
5f00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42  .    assert( pzB
5f10: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65  uffer==0 || isRe
5f20: 64 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a  duced );..    /*
5f30: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
5f40: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
5f50: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
5f60: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a  e. */.    if( pz
5f70: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
5f80: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
5f90: 65 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  er;.      static
5fa0: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
5fb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5fc0: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
5fd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
5fe0: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
5ff0: 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20  (p, flags));.   
6000: 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45   }.    pNew = (E
6010: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
6020: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
6030: 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77       /* Set nNew
6040: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
6050: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
6060: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
6070: 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  nted to.      **
6080: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
6090: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
60a0: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
60b0: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
60c0: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
60d0: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
60e0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
60f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
6100: 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20  nsumed.      ** 
6110: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
6120: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6130: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
6140: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
6150: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
6160: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
6170: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6180: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
6190: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
61a0: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
61b0: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20  e & 0xfff;.     
61c0: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
61d0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
61e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
61f0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
6200: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
6210: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
6220: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
6230: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
6240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6250: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
6260: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6270: 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20  isReduced ){.   
6280: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
6290: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
62a0: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
62b0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
62c0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
62d0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
62e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
62f0: 6e 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75  nSize = exprStru
6300: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
6310: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
6320: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
6330: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
6340: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
6350: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
6360: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ze);.      }..  
6370: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
6380: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
6390: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
63a0: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
63b0: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
63c0: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
63d0: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
63e0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
63f0: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
6400: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
6410: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
6420: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6430: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e  nOnly);.      pN
6440: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
6450: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20  ticFlag;..      
6460: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
6470: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
6480: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
6490: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
64a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
64b0: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
64c0: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
64d0: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
64e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
64f0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
6500: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
6510: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6520: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
6530: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50  New->flags) & EP
6540: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6550: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
6560: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
6570: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
6580: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
6590: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  /.        if( Ex
65a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
65b0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
65c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
65d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
65e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
65f0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
6600: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
6610: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6620: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
6630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
6640: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
6650: 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63  x.pList, isReduc
6660: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ed);.        }. 
6670: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
6680: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
6690: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
66a0: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  Right. */.      
66b0: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
66c0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
66d0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
66e0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
66f0: 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64   zAlloc += duped
6700: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
6710: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
6720: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
6730: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
6740: 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  uced) ){.       
6750: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
6760: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6770: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
6780: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
6790: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
67a0: 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75  >pRight = exprDu
67b0: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
67c0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
67d0: 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20   &zAlloc);.     
67e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
67f0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
6800: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
6810: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
6820: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6830: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6840: 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20  flags2 = 0;.    
6850: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
6860: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
6870: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6880: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6890: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
68a0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
68b0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
68c0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
68d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
68e0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
68f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
6900: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
6910: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6920: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
6930: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
6940: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
6950: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
6960: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
6970: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
6980: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
6990: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
69a0: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
69b0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
69c0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
69d0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
69e0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
69f0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
6a00: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
6a10: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
6a20: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
6a30: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
6a40: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
6a50: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
6a60: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
6a70: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
6a80: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
6a90: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
6aa0: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
6ab0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
6ac0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
6ad0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
6ae0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
6af0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
6b00: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
6b10: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
6b20: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
6b30: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
6b40: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
6b50: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
6b60: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
6b70: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
6b80: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6b90: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6ba0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6bb0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
6bc0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
6bd0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
6be0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
6bf0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
6c00: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
6c10: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
6c20: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6c30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6c40: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
6c50: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6c60: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
6c70: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
6c80: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
6c90: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
6ca0: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
6cb0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
6cc0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
6cd0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
6ce0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
6cf0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
6d00: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
6d10: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6d20: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
6d30: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
6d40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6d50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
6d60: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
6d70: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
6d80: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
6d90: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
6da0: 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  >iECursor = 0;. 
6db0: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
6dc0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
6dd0: 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e  >nExpr;.  pNew->
6de0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
6df0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
6e00: 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  b,  p->nExpr*siz
6e10: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
6e20: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
6e30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
6e40: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
6e50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6e60: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
6e70: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
6e80: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
6e90: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
6ea0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
6eb0: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
6ec0: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
6ed0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
6ee0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6ef0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
6f00: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
6f10: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
6f20: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
6f30: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
6f40: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
6f50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6f60: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
6f70: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
6f80: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
6f90: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
6fa0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
6fb0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
6fc0: 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74  m->iCol = pOldIt
6fd0: 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49  em->iCol;.    pI
6fe0: 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f  tem->iAlias = pO
6ff0: 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a  ldItem->iAlias;.
7000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7010: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
7020: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
7030: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
7040: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
7050: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
7060: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
7070: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
7080: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
7090: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
70a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
70b0: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
70c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
70d0: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
70e0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
70f0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
7100: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
7110: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
7120: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
7130: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
7140: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
7150: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7160: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
7170: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
7180: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7190: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
71a0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
71b0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
71c0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
71d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
71e0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
71f0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
7200: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
7210: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
7220: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
7230: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7240: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
7250: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
7260: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7270: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
7280: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
7290: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
72a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
72b0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
72c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
72d0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
72e0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
72f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
7300: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
7310: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
7320: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
7330: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
7340: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7350: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
7360: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
7370: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
7380: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7390: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
73a0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
73b0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
73c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
73d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
73e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
73f0: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
7400: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
7410: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
7420: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
7430: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
7440: 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  NewItem->addrFil
7450: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
7460: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
7470: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
7480: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
7490: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
74a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72   pNewItem->isCor
74b0: 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  related = pOldIt
74c0: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
74d0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
74e0: 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
74f0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7500: 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  dItem->zIndex);.
7510: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f      pNewItem->no
7520: 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49  tIndexed = pOldI
7530: 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b  tem->notIndexed;
7540: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7550: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
7560: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
7570: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
7580: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
7590: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
75a0: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
75b0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
75c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
75d0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
75e0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
75f0: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
7600: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
7610: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
7620: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7630: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
7640: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7650: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
7660: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
7670: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
7680: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
7690: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
76a0: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
76b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
76c0: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
76d0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
76e0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
76f0: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
7700: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
7710: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7720: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7730: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7740: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7750: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7760: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7770: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
7780: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
7790: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
77a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
77b0: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
77c0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
77d0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
77e0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
77f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
7800: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
7810: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
7820: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
7830: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
7840: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7850: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7860: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
7870: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
7880: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
7890: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
78a0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
78b0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
78c0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
78d0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
78e0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
78f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
7900: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
7910: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
7920: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
7930: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7940: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
7950: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7960: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7970: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7980: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7990: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
79a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
79b0: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
79c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
79d0: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
79e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
79f0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
7a00: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
7a10: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
7a20: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
7a30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7a40: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
7a50: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7a60: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
7a70: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7a80: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
7a90: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
7aa0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
7ab0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
7ac0: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
7ad0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
7ae0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7af0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
7b00: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
7b10: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
7b20: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
7b30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7b40: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
7b50: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  r, flags);.  pNe
7b60: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
7b70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7b80: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
7b90: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
7ba0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7bb0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
7bc0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
7bd0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
7be0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
7bf0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
7c00: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
7c10: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
7c20: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
7c30: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
7c40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7c50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
7c60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
7c70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
7c80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7c90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
7ca0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
7cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
7cc0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
7cd0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
7ce0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7cf0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
7d00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7d10: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
7d20: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
7d30: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
7d40: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
7d50: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
7d60: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
7d70: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
7d80: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
7d90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
7da0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7db0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
7dc0: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
7dd0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
7de0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
7df0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
7e00: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
7e10: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
7e20: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
7e30: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
7e40: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
7e50: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
7e60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7e70: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
7e80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7e90: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7ea0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
7eb0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
7ec0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
7ed0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
7ee0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
7ef0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
7f00: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7f10: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
7f20: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
7f30: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
7f40: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7f50: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
7f60: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
7f70: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7f80: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
7f90: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
7fa0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
7fb0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
7fc0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
7fd0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
7fe0: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
7ff0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
8000: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
8010: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
8020: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
8030: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
8040: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
8050: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
8060: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
8070: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
8080: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
8090: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
80a0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
80b0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
80c0: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
80d0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
80e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
80f0: 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a 65  Size(db, a)/size
8100: 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  of(a[0]);.  }.  
8110: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
8120: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
8130: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8140: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8150: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
8160: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
8170: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
8180: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
8190: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
81a0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
81b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
81c0: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
81d0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
81e0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
81f0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
8200: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
8210: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
8220: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
8230: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
8240: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
8250: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
8260: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
8270: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
8280: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8290: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
82a0: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
82b0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
82c0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
82d0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
82e0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
82f0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
8300: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
8310: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
8320: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
8330: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
8340: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
8350: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
8360: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8370: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
8380: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8390: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
83a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
83b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
83c0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
83d0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
83e0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
83f0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
8400: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
8410: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
8420: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
8430: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
8440: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
8450: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
8460: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
8470: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
8480: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8490: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
84a0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
84b0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
84c0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
84d0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
84e0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
84f0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
8500: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
8510: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
8520: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
8530: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
8540: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
8550: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
8560: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8570: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
8580: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
8590: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
85a0: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
85b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
85c0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
85d0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
85e0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
85f0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
8600: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
8610: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8620: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
8630: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
8640: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8650: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
8660: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8670: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8680: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8690: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
86a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
86b0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
86c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
86d0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
86e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
86f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
8700: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8710: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8720: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8730: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8740: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8750: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
8760: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
8770: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
8780: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
8790: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
87a0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
87b0: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
87c0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
87d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
87e0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
87f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8800: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
8810: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
8820: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8830: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
8840: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
8850: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
8860: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
8870: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
8880: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8890: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
88a0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
88b0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
88c0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
88d0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
8910: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
8920: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
8930: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
8940: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
8950: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
8960: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
8970: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
8980: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
8990: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
89a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
89b0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
89c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
89d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
89e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
89f0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
8a00: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
8a10: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8a20: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
8a30: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
8a40: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
8a50: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
8a60: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
8a70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
8a80: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
8a90: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
8aa0: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
8ab0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8ac0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8ad0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
8ae0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
8af0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
8b00: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
8b10: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
8b20: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
8b30: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
8b40: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
8b50: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
8b60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8b70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8b80: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
8b90: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8ba0: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
8bb0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   (pList->nExpr==
8bc0: 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  0 && pList->nAll
8bd0: 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  oc==0) );.  asse
8be0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
8bf0: 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  <=pList->nAlloc 
8c00: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
8c10: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
8c20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8c30: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8c40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8c50: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
8c60: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8c70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8c80: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
8c90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8ca0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8cb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
8cc0: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
8cd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8ce0: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
8cf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
8d00: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
8d10: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
8d20: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
8d30: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8d40: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
8d50: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
8d60: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
8d70: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
8d80: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
8d90: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
8da0: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
8db0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
8dc0: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
8dd0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
8de0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
8df0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
8e00: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
8e10: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
8e20: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8e30: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
8e40: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8e50: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
8e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
8e70: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8e80: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
8e90: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
8ea0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
8eb0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
8ec0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
8ed0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
8ee0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
8ef0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
8f00: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
8f10: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
8f20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
8f30: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
8f40: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
8f50: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
8f60: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
8f70: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
8f80: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
8f90: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
8fa0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8fb0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
8fc0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
8fd0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
8fe0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
8ff0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9000: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
9010: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
9020: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
9030: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
9040: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
9050: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
9060: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20  pWalker->u.i==2 
9070: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
9080: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
9090: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
90a0: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
90b0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
90c0: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
90d0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
90e0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
90f0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
9100: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
9110: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
9120: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9130: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
9140: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9150: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9160: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
9170: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9180: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
9190: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
91a0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
91b0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
91c0: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
91d0: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
91e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
91f0: 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  rt;.    default:
9200: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9210: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
9220: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
9230: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9240: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9250: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9260: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9270: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
9280: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9290: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
92a0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
92b0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
92c0: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
92d0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
92e0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
92f0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
9300: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
9310: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
9320: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
9330: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
9340: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
9350: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
9360: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
9370: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
9380: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69  alker w;.  w.u.i
9390: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
93a0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
93b0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
93c0: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
93d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
93e0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
93f0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
9400: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
9410: 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a  urn w.u.i;.}../*
9420: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9430: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9440: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9450: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9460: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
9470: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9480: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9490: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
94a0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
94b0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
94c0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
94d0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
94e0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
94f0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
9500: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
9510: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9520: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
9530: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
9540: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9550: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
9560: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9570: 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a  sConst(p, 1);.}.
9580: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9590: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
95a0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
95b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
95c0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
95d0: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
95e0: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
95f0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
9600: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
9610: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
9620: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9630: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9640: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
9650: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
9660: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
9670: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9680: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
9690: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
96a0: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
96b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
96c0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
96d0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
96e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
96f0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9700: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
9710: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
9720: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
9730: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
9740: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
9750: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
9760: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9770: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9780: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9790: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
97a0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
97b0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
97c0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
97d0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
97e0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
97f0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
9800: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9810: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9820: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
9830: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
9840: 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 2);.}../*.** 
9850: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9860: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
9870: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
9880: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
9890: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
98a0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
98b0: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
98c0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
98d0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
98e0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
98f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9900: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
9910: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
9920: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
9930: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
9940: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9950: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
9960: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
9970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9980: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
9990: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
99a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
99b0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
99c0: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
99d0: 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
99e0: 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
99f0: 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
9a00: 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
9a10: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
9a20: 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
9a30: 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
9a40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
9a50: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
9a60: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
9a70: 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
9a80: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9a90: 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
9aa0: 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
9ab0: 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
9ac0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
9ad0: 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
9ae0: 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
9af0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9b00: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
9b10: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
9b20: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
9b30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
9b40: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
9b50: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
9b60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9b70: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
9b80: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
9b90: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9ba0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9bb0: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9bc0: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9bd0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9be0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9bf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9c00: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
9c10: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
9c20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
9c30: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
9c40: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
9c50: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
9c60: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
9c70: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
9c80: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
9c90: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
9ca0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9cb0: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
9cc0: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
9cd0: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
9ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
9cf0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
9d00: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
9d10: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
9d20: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
9d30: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
9d40: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
9d50: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
9d60: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
9d70: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
9d80: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
9d90: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
9da0: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
9db0: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
9dc0: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
9dd0: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
9de0: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
9df0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
9e00: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
9e10: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
9e20: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
9e30: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
9e40: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
9e50: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
9e60: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
9e70: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
9e80: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
9e90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
9ea0: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
9eb0: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
9ec0: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
9ed0: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
9ee0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
9ef0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
9f00: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
9f10: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
9f20: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
9f30: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
9f40: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
9f50: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
9f60: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
9f70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
9f80: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
9f90: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
9fa0: 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c  rn 0;.    defaul
9fb0: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
9fc0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
9fd0: 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49  Generate an OP_I
9fe0: 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f  sNull instructio
9ff0: 6e 20 74 68 61 74 20 74 65 73 74 73 20 72 65 67  n that tests reg
a000: 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a  ister iReg and j
a010: 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  umps.** to locat
a020: 69 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68 65  ion iDest if the
a030: 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69   value in iReg i
a040: 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c  s NULL.  The val
a050: 75 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77  ue in iReg .** w
a060: 61 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70  as computed by p
a070: 45 78 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e  Expr.  If we can
a080: 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61   look at pExpr a
a090: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61  t compile-time a
a0a0: 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  nd.** determine 
a0b0: 74 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65  that it can neve
a0c0: 72 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c  r generate a NUL
a0d0: 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49  L, then the OP_I
a0e0: 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a  sNull operation.
a0f0: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
a100: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
a110: 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
a120: 4a 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c  Jump(.  Vdbe *v,
a130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a140: 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
a150: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
a160: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
a170: 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65  r,  /* Only gene
a180: 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69  rate OP_IsNull i
a190: 66 20 74 68 69 73 20 65 78 70 72 20 63 61 6e 20  f this expr can 
a1a0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
a1b0: 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 20 20   iReg,          
a1c0: 20 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c   /* Test the val
a1d0: 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
a1e0: 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ter for NULL */.
a1f0: 20 20 69 6e 74 20 69 44 65 73 74 20 20 20 20 20    int iDest     
a200: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
a210: 72 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  re if the value 
a220: 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  is null */.){.  
a230: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
a240: 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20  anBeNull(pExpr) 
a250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a260: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a270: 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65  sNull, iReg, iDe
a280: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
a290: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
a2a0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a2b0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
a2c0: 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
a2d0: 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
a2e0: 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
a2f0: 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
a300: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
a310: 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
a320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a330: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
a340: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
a350: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
a360: 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
a370: 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
a380: 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
a390: 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
a3a0: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
a3b0: 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
a3c0: 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
a3d0: 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
a3e0: 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
a3f0: 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
a400: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
a410: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
a420: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
a430: 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
a440: 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
a450: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20  LITE_AFF_NONE ) 
a460: 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
a470: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
a480: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
a490: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
a4a0: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
a4b0: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
a4c0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
a4d0: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
a4e0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
a4f0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
a500: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a510: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a520: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
a530: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a540: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
a550: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
a560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
a570: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
a580: 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
a590: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
a5a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a5b0: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
a5c0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
a5d0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
a5e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
a5f0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
a600: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
a610: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
a620: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a630: 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
a640: 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
a650: 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
a660: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
a670: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
a680: 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
a690: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
a6a0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
a6b0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
a6c0: 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
a6d0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
a6e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a6f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a700: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
a710: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
a720: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
a730: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
a740: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
a750: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
a760: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
a770: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
a780: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
a790: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a7a0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
a7b0: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
a7c0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a7d0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
a7e0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
a7f0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
a800: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a810: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62  rue if we are ab
a820: 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65  le to the IN ope
a830: 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  rator optimizati
a840: 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79  on on a.** query
a850: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
a860: 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53  **       x IN (S
a870: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
a880: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
a890: 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61  T... clause is a
a8a0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
a8b0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  he parameter to 
a8c0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  this.** routine.
a8d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63  .**.** The Selec
a8e0: 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
a8f0: 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  in has already b
a900: 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64  een preprocessed
a910: 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72   and no.** error
a920: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e  s have been foun
a930: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
a940: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a950: 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  RY.static int is
a960: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
a970: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
a980: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
a990: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
a9a0: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
a9b0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
a9c0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
a9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69             /* ri
a9e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
a9f0: 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f   IN is SELECT */
aa00: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
aa10: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
aa20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
aa30: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
aa40: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
aa50: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
aa60: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
aa70: 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
aa80: 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
aa90: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
aaa0: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
aab0: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
aac0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
aad0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
aae0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
aaf0: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
ab00: 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
ab10: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
ab20: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
ab30: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
ab40: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
ab50: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
ab60: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
ab70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
ab80: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
ab90: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
aba0: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
abb0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
abc0: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
abd0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73   clause */.  ass
abe0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
abf0: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
ac00: 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20      /* No LIMIT 
ac10: 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20  means no OFFSET 
ac20: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
ac30: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ac50: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
ac60: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
ac70: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
ac80: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
ac90: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
aca0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
acb0: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
acc0: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
acd0: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
ace0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
acf0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
ad00: 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
ad10: 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
ad20: 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
ad30: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
ad40: 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d   if( NEVER(pTab=
ad50: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
ad60: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
ad70: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
ad80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
ad90: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
ada0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
adb0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
adc0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
add0: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
ade0: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
adf0: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
ae00: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
ae10: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
ae20: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
ae30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
ae40: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
ae50: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20  lt set */.  if( 
ae60: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
ae70: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
ae80: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  N ) return 0; /*
ae90: 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   Result is a col
aea0: 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  umn */.  return 
aeb0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
aec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
aed0: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ERY */../*.** Th
aee0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
aef0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
af00: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
af10: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
af20: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
af30: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
af40: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
af50: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
af60: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
af70: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
af80: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
af90: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
afa0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
afb0: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
afc0: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
afd0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
afe0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72  index of the cur
aff0: 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  sor opened on th
b000: 65 20 62 2d 74 72 65 65 20 28 64 61 74 61 62 61  e b-tree (databa
b010: 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61  se table, databa
b020: 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20  se index .** or 
b030: 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20  ephermal table) 
b040: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d  is stored in pX-
b050: 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74  >iTable before t
b060: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b070: 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74  urns..** The ret
b080: 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
b090: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
b0a0: 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
b0b0: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
b0c0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
b0d0: 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65  NDEX_ROWID - The
b0e0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
b0f0: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
b100: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
b110: 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68  INDEX_INDEX - Th
b120: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
b130: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
b140: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  e index..**   IN
b150: 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54  _INDEX_EPH -   T
b160: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
b170: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
b180: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
b190: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b1a0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
b1b0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
b1c0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
b1d0: 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20 6f 6e  ng b-tree may on
b1e0: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ly be used if th
b1f0: 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
b200: 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72  he simple.** for
b210: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  m:.**.**     SEL
b220: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
b230: 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
b240: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b250: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
b260: 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  , then the b-tre
b270: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
b280: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
b290: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
b2a0: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
b2b0: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
b2c0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
b2d0: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
b2e0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
b2f0: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
b300: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
b310: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
b320: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
b330: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
b340: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
b350: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
b360: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f   has a UNIQUE co
b370: 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51  nstraint or UNIQ
b380: 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  UE index..**.** 
b390: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b3a0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
b3b0: 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62  ot 0, then the b
b3c0: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
b3d0: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
b3e0: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
b3f0: 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ests. In this ca
b400: 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  se an epheremal 
b410: 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
b420: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
b430: 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54  olumn> is an INT
b440: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b450: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   or an index can
b460: 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69   .** be found wi
b470: 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69  th <column> as i
b480: 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ts left-most col
b490: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  umn..**.** When 
b4a0: 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
b4b0: 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
b4c0: 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
b4d0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
b4e0: 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  ion.** needs to 
b4f0: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
b500: 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72  not the structur
b510: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51  e contains an SQ
b520: 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65  L NULL .** value
b530: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72   in order to cor
b540: 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20  rectly evaluate 
b550: 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65  expressions like
b560: 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a   "X IN (Y, Z)"..
b570: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
b580: 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
b590: 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
b5a0: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
b5b0: 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
b5c0: 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
b5d0: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
b5e0: 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
b5f0: 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
b600: 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e  ** to *prNotFoun
b610: 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  d. If there is n
b620: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
b630: 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
b640: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
b650: 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75  , then *prNotFou
b660: 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  nd is left uncha
b670: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
b680: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
b690: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
b6a0: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
b6b0: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74  n *prNotFound, t
b6c0: 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69  hen.** its initi
b6d0: 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  al value is NULL
b6e0: 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20  .  If the (...) 
b6f0: 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20  does not remain 
b700: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
b710: 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20  the duration of 
b720: 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20  the query (i.e. 
b730: 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68 69  the SELECT withi
b740: 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69  n the (...).** i
b750: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
b760: 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
b770: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
b780: 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65  llocated registe
b790: 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f  r is.** reset to
b7a0: 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20   NULL each time 
b7b0: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
b7c0: 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f  rerun. This allo
b7d0: 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  ws the.** caller
b7e0: 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64   to use vdbe cod
b7f0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
b800: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b810: 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73  *.**   if( regis
b820: 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20  ter==NULL ){.** 
b830: 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c      has_null = <
b840: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
b850: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
b860: 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67  null>.**     reg
b870: 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d  ister = 1.**   }
b880: 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  .**.** in order 
b890: 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67  to avoid running
b8a0: 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61   the <test if da
b8b0: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
b8c0: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74  tains null>.** t
b8d0: 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  est more often t
b8e0: 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  han is necessary
b8f0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b900: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b910: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
b920: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
b930: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
b940: 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e  , int *prNotFoun
b950: 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  d){.  Select *p;
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b980: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
b990: 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
b9a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
b9b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9d0: 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
b9e0: 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
b9f0: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
ba00: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
ba10: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
ba20: 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
ba30: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
ba40: 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e  tBeUnique = (prN
ba50: 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f  otFound==0);   /
ba60: 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
ba70: 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
ba80: 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
ba90: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f  p==TK_IN );..  /
baa0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
bab0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
bac0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
bad0: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
bae0: 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
baf0: 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
bb00: 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
bb10: 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
bb20: 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
bb30: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45  e..  */.  p = (E
bb40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
bb50: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
bb60: 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   ? pX->x.pSelect
bb70: 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57   : 0);.  if( ALW
bb80: 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  AYS(pParse->nErr
bb90: 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64  ==0) && isCandid
bba0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
bbb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
bbc0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bbe0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
bbf0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 56 64 62 65 20  ion */.    Vdbe 
bc00: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
bc10: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
bc20: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
bc30: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
bc40: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
bc50: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc70: 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
bc80: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45   */.    Expr *pE
bc90: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bcb0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f  * Expression <co
bcc0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn> */.    int
bcd0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
bd00: 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  column <column> 
bd10: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd40: 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
bd50: 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61  r pTab */..    a
bd60: 73 73 65 72 74 28 20 70 20 29 3b 20 20 20 20 20  ssert( p );     
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
bd90: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
bda0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
bdb0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
bdc0: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
bdd0: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
bde0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
bdf0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
be00: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
be10: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
be20: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
be30: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
be40: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
be50: 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
be60: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
be70: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
be80: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
be90: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
bea0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
beb0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45  [0].pTab;.    pE
bec0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
bed0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
bee0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
bef0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
bf00: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65  /* Code an OP_Ve
bf10: 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f  rifyCookie and O
bf20: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
bf30: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
bf40: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
bf50: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
bf60: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
bf70: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
bf80: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
bf90: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
bfa0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
bfb0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
bfc0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
bfd0: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
bfe0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
bff0: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
c000: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
c010: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
c020: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
c030: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
c040: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
c050: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
c060: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
c070: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
c080: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
c090: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
c0a0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
c0b0: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
c0c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c0d0: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a      int iAddr;..
c0e0: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
c0f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c100: 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 69 4d 65 6d  v, OP_Once, iMem
c110: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
c120: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
c130: 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
c140: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
c150: 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
c160: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
c170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c180: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
c190: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
c1a0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
c1b0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c1d0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
c1e0: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
c1f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
c200: 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65  ence used by the
c210: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20   comparison. If 
c220: 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20  an index is to. 
c230: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
c240: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
c250: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
c260: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
c270: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
c280: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
c290: 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a  n sequence.  */.
c2a0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
c2b0: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
c2c0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
c2d0: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
c2e0: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
c2f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
c300: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
c310: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
c320: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
c330: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
c340: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
c350: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
c360: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
c370: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
c380: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
c390: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
c3a0: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
c3b0: 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
c3c0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
c3d0: 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20  Affinity(pX);.  
c3e0: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
c3f0: 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f  _ok = (pTab->aCo
c400: 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
c410: 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49  ==aff||aff==SQLI
c420: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20  TE_AFF_NONE);.. 
c430: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
c440: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
c450: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
c460: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
c470: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
c480: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
c490: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
c4a0: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
c4b0: 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  & sqlite3FindCol
c4c0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
c4d0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
c4e0: 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20  ], 0)==pReq.    
c4f0: 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65       && (!mustBe
c500: 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d  Unique || (pIdx-
c510: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
c520: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
c530: 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20  _None)).        
c540: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c550: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
c560: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
c570: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20    int iAddr;.   
c580: 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65         char *pKe
c590: 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  y;.  .          
c5a0: 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73  pKey = (char *)s
c5b0: 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
c5c0: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
c5d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64  ;.          iAdd
c5e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c5f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
c600: 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20  , iMem);.  .    
c610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c620: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
c630: 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
c640: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  dx->tnum, iDb,. 
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
c670: 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  ey,P4_KEYINFO_HA
c680: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20  NDOFF);.        
c690: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c6a0: 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  , "%s", pIdx->zN
c6b0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
c6c0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
c6d0: 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20  X_INDEX;..      
c6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c6f0: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
c700: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
c710: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21   prNotFound && !
c720: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c730: 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  .notNull ){.    
c740: 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f          *prNotFo
c750: 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  und = ++pParse->
c760: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
c770: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
c780: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
c790: 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
c7a0: 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
c7b0: 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74  t found an exist
c7c0: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
c7d0: 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
c7e0: 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
c7f0: 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
c800: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
c810: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
c820: 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
c830: 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65     */.    double
c840: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
c850: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
c860: 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
c870: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
c880: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
c890: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
c8a0: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b  f( prNotFound ){
c8b0: 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75  .      *prNotFou
c8c0: 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  nd = rMayHaveNul
c8d0: 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
c8e0: 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  em;.    }else{. 
c8f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c900: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
c910: 70 3e 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20  p>(double)1 );. 
c920: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
c930: 65 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c  eryLoop = (doubl
c940: 65 29 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e)1;.      if( p
c950: 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
c960: 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 41  n<0 && !ExprHasA
c970: 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  nyProperty(pX, E
c980: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
c990: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
c9a0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
c9b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c9c0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
c9d0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
c9e0: 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  X, rMayHaveNull,
c9f0: 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
ca00: 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61  _ROWID);.    pPa
ca10: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
ca20: 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
ca30: 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
ca40: 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
ca50: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
ca60: 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
ca70: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ca80: 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
ca90: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
caa0: 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
cab0: 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
cac0: 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
cad0: 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
cae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
caf0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
cb00: 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
cb10: 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
cb20: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
cb30: 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
cb40: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
cb50: 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
cb60: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
cb70: 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
cb80: 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
cb90: 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
cba0: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
cbb0: 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
cbc0: 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
cbd0: 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
cbe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
cbf0: 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
cc00: 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
cc10: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
cc20: 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
cc30: 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
cc40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
cc50: 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
cc60: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
cc70: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
cc80: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
cc90: 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
cca0: 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
ccb0: 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
ccc0: 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
ccd0: 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
cce0: 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
ccf0: 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
cd00: 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
cd10: 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
cd20: 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
cd30: 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
cd40: 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
cd50: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
cd60: 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
cd70: 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
cd80: 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
cd90: 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
cda0: 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
cdb0: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
cdc0: 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
cdd0: 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
cde0: 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
cdf0: 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
ce00: 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
ce10: 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
ce20: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65  Furthermore, the
ce30: 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48 45 52   IN is in a WHER
ce40: 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 61  E clause and tha
ce50: 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61 6e 74  t we really want
ce60: 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65 20 6f  .** to iterate o
ce70: 76 65 72 20 74 68 65 20 52 48 53 20 6f 66 20 74  ver the RHS of t
ce80: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
ce90: 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69 63 6b  n order to quick
cea0: 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c  ly locate.** all
ceb0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c   corresponding L
cec0: 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c  HS elements.  Al
ced0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
cee0: 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
cef0: 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  e.** the registe
cf00: 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
cf10: 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e  aveNull to NULL.
cf20: 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
cf30: 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20  es will take.** 
cf40: 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
cf50: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 76   this register v
cf60: 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
cf70: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
cf80: 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
cf90: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
cfa0: 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  is zero, that me
cfb0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
cfc0: 71 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 75  query is being u
cfd0: 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65  sed.** for membe
cfe0: 72 73 68 69 70 20 74 65 73 74 69 6e 67 20 6f 6e  rship testing on
cff0: 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ly.  There is no
d000: 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   need to initial
d010: 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73  ize any.** regis
d020: 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61 74 65  ters to indicate
d030: 20 74 68 65 20 70 72 65 73 65 6e 73 65 20 6f 72   the presense or
d040: 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c   absence of NULL
d050: 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  s on the RHS..**
d060: 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
d070: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
d080: 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
d090: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
d0a0: 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
d0b0: 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61  t.  For IN opera
d0c0: 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
d0d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
d0e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
d0f0: 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  0..*/.#ifndef SQ
d100: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
d110: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
d120: 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
d130: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d140: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d150: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
d160: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
d170: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
d180: 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
d190: 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
d1a0: 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
d1b0: 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ll,       /* Reg
d1c0: 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
d1d0: 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
d1e0: 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
d1f0: 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
d200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
d210: 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
d220: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
d230: 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
d240: 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b 20   testAddr = -1; 
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
d270: 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
d280: 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d2b0: 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
d2c0: 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
d2d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
d2e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d2f0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
d300: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
d310: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
d320: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
d330: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
d340: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
d350: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
d360: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
d370: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
d380: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
d390: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
d3a0: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
d3b0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
d3c0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
d3d0: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
d3e0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
d3f0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
d400: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
d410: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
d420: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
d430: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
d440: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
d450: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
d460: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
d470: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
d480: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
d490: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
d4a0: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
d4b0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
d4c0: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
d4d0: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
d4e0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
d4f0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
d500: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
d510: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
d520: 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
d530: 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70     int mem = ++p
d540: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
d550: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
d560: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d570: 20 4f 50 5f 4f 6e 63 65 2c 20 6d 65 6d 29 3b 0a   OP_Once, mem);.
d580: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
d590: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
d5a0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
d5b0: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
d5c0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
d5d0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
d5e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
d5f0: 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20  , "EXECUTE %s%s 
d600: 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 74 65  SUBQUERY %d", te
d610: 73 74 41 64 64 72 3e 3d 30 3f 22 22 3a 22 43 4f  stAddr>=0?"":"CO
d620: 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20  RRELATED ",.    
d630: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
d640: 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41  K_IN?"LIST":"SCA
d650: 4c 41 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e  LAR", pParse->iN
d660: 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20  extSelectId.    
d670: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d680: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
d690: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
d6a0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
d6b0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
d6c0: 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
d6d0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
d6e0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
d6f0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63  TK_IN: {.      c
d700: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
d710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
d720: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48  finity of the LH
d730: 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20  S of the IN */. 
d740: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
d750: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
d760: 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
d770: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
d780: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
d790: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
d7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
d7b0: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
d7c0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
d7d0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
d7e0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
d7f0: 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
d800: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
d810: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
d820: 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c   if( rMayHaveNul
d830: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
d840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d850: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d  , OP_Null, 0, rM
d860: 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20  ayHaveNull);.   
d870: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69     }..      affi
d880: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
d890: 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
d8a0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
d8b0: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
d8c0: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
d8d0: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
d8e0: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
d8f0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
d900: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
d910: 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
d920: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
d930: 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
d940: 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66  ed with single-f
d950: 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20  ield index keys 
d960: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
d970: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
d980: 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  * from the SELEC
d990: 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
d9a0: 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
d9b0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
d9c0: 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
d9d0: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
d9e0: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
d9f0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
da00: 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
da10: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
da20: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
da30: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
da40: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
da50: 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
da60: 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
da70: 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
da80: 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
da90: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
daa0: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
dab0: 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
dac0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
dad0: 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
dae0: 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
daf0: 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
db00: 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
db10: 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
db20: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
db30: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
db40: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
db50: 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
db60: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
db70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
db80: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
db90: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
dba0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
dbb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
dbc0: 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d  phemeral, pExpr-
dbd0: 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69  >iTable, !isRowi
dbe0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d  d);.      if( rM
dbf0: 61 79 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20  ayHaveNull==0 ) 
dc00: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
dc10: 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
dc20: 52 44 45 52 45 44 29 3b 0a 20 20 20 20 20 20 6d  RDERED);.      m
dc30: 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20  emset(&keyInfo, 
dc40: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66  0, sizeof(keyInf
dc50: 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  o));.      keyIn
dc60: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a  fo.nField = 1;..
dc70: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
dc80: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
dc90: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
dca0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
dcb0: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
dcc0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
dcd0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
dce0: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
dcf0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
dd00: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
dd10: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
dd20: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
dd30: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
dd40: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
dd50: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
dd60: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
dd70: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
dd80: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
dd90: 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
dda0: 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
ddb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
ddc0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
ddd0: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
dde0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
ddf0: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e        dest.affin
de00: 69 74 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69  ity = (u8)affini
de10: 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ty;.        asse
de20: 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62  rt( (pExpr->iTab
de30: 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d  le&0x0000FFFF)==
de40: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
de50: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
de60: 78 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  x.pSelect->iLimi
de70: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
de80: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
de90: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
dea0: 78 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  x.pSelect, &dest
deb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
dec0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
ded0: 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73   }.        pELis
dee0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
def0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
df00: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
df10: 28 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45  (pEList!=0 && pE
df20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29  List->nExpr>0) )
df30: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79  { .          key
df40: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
df50: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
df60: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
df70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
df80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
df90: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
dfa0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
dfb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
dfc0: 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
dfd0: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
dfe0: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
dff0: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
e000: 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
e010: 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
e020: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
e030: 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
e040: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
e050: 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
e060: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
e070: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
e080: 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
e090: 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
e0a0: 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
e0b0: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
e0c0: 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
e0d0: 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
e0e0: 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
e0f0: 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
e100: 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
e110: 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
e120: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e130: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
e140: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e150: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
e160: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
e170: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e180: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
e190: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
e1a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
e1b0: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
e1c0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
e1d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
e1e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e1f0: 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b    keyInfo.aColl[
e200: 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
e210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
e220: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a  pExpr->pLeft);..
e230: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e240: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
e250: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
e260: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
e270: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
e280: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
e290: 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
e2a0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
e2b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
e2c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e2d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
e2e0: 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  0, r2);.        
e2f0: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
e300: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
e310: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
e320: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
e330: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
e340: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
e350: 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f        int iValTo
e360: 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Ins;..          
e370: 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
e380: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
e390: 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
e3a0: 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
e3b0: 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
e3c0: 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
e3d0: 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
e3e0: 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
e3f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
e400: 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
e410: 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
e420: 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
e430: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
e440: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
e450: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
e460: 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
e470: 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
e480: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e490: 20 74 65 73 74 41 64 64 72 3e 3d 30 20 26 26 20   testAddr>=0 && 
e4a0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
e4b0: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
e4c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e4d0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
e4e0: 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b  op(v, testAddr);
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
e500: 74 41 64 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  tAddr = -1;.    
e510: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e520: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
e530: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
e540: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
e550: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
e560: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e570: 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69   isRowid && sqli
e580: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
e590: 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73  (pE2, &iValToIns
e5a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
e5b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5c0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
e5d0: 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
e5e0: 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
e5f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
e600: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e610: 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
e620: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
e630: 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
e640: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
e650: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
e660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e670: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
e680: 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e6b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e6c0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
e6d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e6e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e6f0: 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
e700: 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
e710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
e720: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e740: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
e750: 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
e760: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e780: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
e790: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
e7a0: 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
e7b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e7c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e7d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
e7e0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
e7f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e800: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e810: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
e820: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
e830: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
e840: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e850: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
e860: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
e870: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69    }.      if( !i
e880: 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
e890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e8a0: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
e8b0: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
e8c0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
e8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e8e0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
e8f0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
e900: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
e910: 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
e920: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
e930: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
e940: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
e950: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
e960: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
e970: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
e980: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
e990: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
e9a0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
e9b0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
e9c0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
e9d0: 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  mn.  If this is 
e9e0: 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
e9f0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  .      ** an int
ea00: 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
ea10: 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
ea20: 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ) into a memory 
ea30: 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e  cell.      ** an
ea40: 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65  d record that me
ea50: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
ea60: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
ea70: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
ea80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ea90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
eaa0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
eab0: 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
eac0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
ead0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
eae0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
eaf0: 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
eb00: 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  Ct result */..  
eb10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
eb20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
eb30: 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
eb40: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
eb50: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
eb60: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
eb70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
eb80: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
eb90: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20  K_SELECT );..   
eba0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
ebb0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
ebc0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
ebd0: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  );.      pSel = 
ebe0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
ebf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
ec00: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
ec10: 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65  est, 0, ++pParse
ec20: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69  ->nMem);.      i
ec30: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
ec40: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
ec50: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
ec60: 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
ec70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ec80: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
ec90: 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20  , dest.iParm);. 
eca0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
ecb0: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
ecc0: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
ecd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ece0: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
ecf0: 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
ed00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ed10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ed20: 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
ed30: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iParm);.        
ed40: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ed50: 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
ed60: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
ed70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ed80: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
ed90: 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
eda0: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
edb0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
edc0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
edd0: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
ee10: 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
ee20: 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
ee30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ee40: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ee50: 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
ee60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
ee70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee80: 72 52 65 67 20 3d 20 64 65 73 74 2e 69 50 61 72  rReg = dest.iPar
ee90: 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  m;.      ExprSet
eea0: 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70  Irreducible(pExp
eeb0: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
eec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
eed0: 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20 29 7b  ( testAddr>=0 ){
eee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
eef0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74  JumpHere(v, test
ef00: 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Addr);.  }.  sql
ef10: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
ef20: 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20  (pParse, 1);..  
ef30: 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
ef40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ef50: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ef60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ef70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
ef80: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
ef90: 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70  de for an IN exp
efa0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
efb0: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
efc0: 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20   ...).**      x 
efd0: 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
efe0: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  , ...).**.** The
eff0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
f000: 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61  (LHS) is a scala
f010: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
f020: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
f030: 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61  de (RHS).** is a
f040: 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
f050: 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20  or more values. 
f060: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
f070: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
f080: 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e  HS is.** contain
f090: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
f0a0: 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66  S.  The value of
f0b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f0c0: 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c  is unknown (NULL
f0d0: 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20  ).** if the LHS 
f0e0: 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  is NULL or if th
f0f0: 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e LHS is not con
f100: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
f110: 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a  e RHS and the.**
f120: 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   RHS contains on
f130: 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
f140: 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alues..**.** Thi
f150: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
f160: 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75  tes code will ju
f170: 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  mp to destIfFals
f180: 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
f190: 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
f1a0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
f1b0: 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
f1c0: 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
f1d0: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
f1e0: 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
f1f0: 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
f200: 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
f210: 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
f220: 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
f230: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
f240: 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
f250: 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gh..*/.static vo
f260: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
f270: 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70  deIN(.  Parse *p
f280: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
f290: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
f2a0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
f2b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
f2c0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
f2d0: 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73  /* The IN expres
f2e0: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
f2f0: 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20  stIfFalse,      
f300: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
f310: 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
f320: 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
f330: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e  */.  int destIfN
f340: 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ull        /* Ju
f350: 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72  mp here if the r
f360: 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f  esults are unkno
f370: 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  wn due to NULLs 
f380: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73  */.){.  int rRhs
f390: 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a  HasNull = 0;  /*
f3a0: 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69   Register that i
f3b0: 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f  s true if RHS co
f3c0: 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
f3d0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66  es */.  char aff
f3e0: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a  inity;        /*
f3f0: 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69   Comparison affi
f400: 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20  nity to use */. 
f410: 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
f420: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
f430: 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
f440: 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
f450: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
f460: 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
f470: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
f480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
f490: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
f4a0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
f4b0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52  /* Compute the R
f4c0: 48 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73  HS.   After this
f4d0: 20 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65   step, the table
f4e0: 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a   with cursor.  *
f4f0: 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
f500: 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68  will contains th
f510: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
f520: 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20  ke up the RHS.. 
f530: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
f540: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
f550: 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
f560: 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
f570: 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
f580: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
f590: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
f5a0: 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
f5b0: 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
f5c0: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
f5d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
f5e0: 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20  rRhsHasNull);.. 
f5f0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
f600: 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  he affinity to u
f610: 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b  se to create a k
f620: 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ey from the resu
f630: 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  lts.  ** of the 
f640: 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
f650: 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
f660: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
f670: 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a  uitable for.  **
f680: 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
f690: 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66  cord..  */.  aff
f6a0: 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73  inity = comparis
f6b0: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
f6c0: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68  );..  /* Code th
f6d0: 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72  e LHS, the <expr
f6e0: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
f6f0: 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20  N (...)"..  */. 
f700: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f710: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
f720: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f730: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f740: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
f750: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f760: 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20  ->pLeft, r1);.. 
f770: 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69   /* If the LHS i
f780: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
f790: 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68 65   result is eithe
f7a0: 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20  r false or NULL 
f7b0: 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f  depending.  ** o
f7c0: 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52 48  n whether the RH
f7d0: 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f  S is empty or no
f7e0: 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
f7f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
f800: 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
f810: 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68  lse ){.    /* Sh
f820: 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
f830: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
f840: 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e   the false and N
f850: 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65  ULL outcomes are
f860: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
f870: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
f880: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f890: 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73  _IsNull, r1, des
f8a0: 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  tIfNull);.  }els
f8b0: 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  e{.    int addr1
f8c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f8d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
f8e0: 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c  ll, r1);.    sql
f8f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f900: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78  , OP_Rewind, pEx
f910: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
f920: 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71  IfFalse);.    sq
f930: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f940: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
f950: 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
f960: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f970: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
f980: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
f990: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
f9a0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
f9b0: 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
f9c0: 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  is the ROWID of 
f9d0: 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20  table b-tree.   
f9e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f9f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fa00: 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64  MustBeInt, r1, d
fa10: 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
fa20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa30: 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
fa40: 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
fa50: 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
fa60: 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r1);.  }else{.  
fa70: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
fa80: 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e  e, the RHS is an
fa90: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20   index b-tree.. 
faa0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
fab0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
fac0: 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20  P_Affinity, r1, 
fad0: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
fae0: 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   1);..    /* If 
faf0: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68  the set membersh
fb00: 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74  ip test fails, t
fb10: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
fb20: 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78  f the .    ** "x
fb30: 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65   IN (...)" expre
fb40: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69  ssion must be ei
fb50: 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20  ther 0 or NULL. 
fb60: 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a  If the set.    *
fb70: 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  * contains no NU
fb80: 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
fb90: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e  the result is 0.
fba0: 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20 20   If the set .   
fbb0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65   ** contains one
fbc0: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
fbd0: 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
fbe0: 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
fbf0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
fc00: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20  s also NULL..   
fc10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73   */.    if( rRhs
fc20: 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65  HasNull==0 || de
fc30: 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
fc40: 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
fc50: 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
fc60: 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77  ns if it is know
fc70: 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  n at compile tim
fc80: 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20  e that the RHS. 
fc90: 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63       ** cannot c
fca0: 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75  ontain NULL valu
fcb0: 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  es. This happens
fcc0: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20   as the result. 
fcd0: 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f       ** of a "NO
fce0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
fcf0: 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
fd00: 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20  se schema..     
fd10: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73   **.      ** Als
fd20: 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63  o run this branc
fd30: 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75  h if NULL is equ
fd40: 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45  ivalent to FALSE
fd50: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
fd60: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e  is particular IN
fd70: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20   operator..     
fd80: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
fd90: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
fda0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70  , OP_NotFound, p
fdb0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
fdc0: 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31  stIfFalse, r1, 1
fdd0: 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  );..    }else{. 
fde0: 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
fdf0: 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20  branch, the RHS 
fe00: 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20  of the IN might 
fe10: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61  contain a NULL a
fe20: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
fe30: 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55  presence of a NU
fe40: 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61  LL on the RHS ma
fe50: 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65  kes a difference
fe60: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
fe70: 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20   outcome..      
fe80: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c  */.      int j1,
fe90: 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20   j2, j3;..      
fea0: 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  /* First check t
feb0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
fec0: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
fed0: 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f   the RHS.  If so
fee0: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
fef0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
ff00: 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
ff10: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
ff20: 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20  , so jump.      
ff30: 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
ff40: 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
ff50: 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lows..      */. 
ff60: 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
ff70: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
ff80: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
ff90: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31  r->iTable, 0, r1
ffa0: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 1);..      /* 
ffb0: 48 65 72 65 20 77 65 20 62 65 67 69 6e 20 67 65  Here we begin ge
ffc0: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68  nerating code th
ffd0: 61 74 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c  at runs if the L
ffe0: 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  HS is not.      
fff0: 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
10000 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65  hin the RHS.  Ge
10010 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61  nerate additiona
10020 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  l code that.    
10030 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52    ** tests the R
10040 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49  HS for NULLs.  I
10050 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  f the RHS contai
10060 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20  ns a NULL then. 
10070 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
10080 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
10090 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c  there are no NUL
100a0 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  Ls in the RHS th
100b0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70  en.      ** jump
100c0 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e   to destIfFalse.
100d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
100e0 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
100f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
10100 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
10110 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73  l);.      j3 = s
10120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10130 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
10140 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10150 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  0, rRhsHasNull, 
10160 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10170 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10180 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72  P_Integer, -1, r
10190 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
101a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
101b0 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20  mpHere(v, j3);. 
101c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
101e0 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  Imm, rRhsHasNull
101f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
10200 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10210 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f  v, j2);..      /
10220 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70  * Jump to the ap
10230 70 72 6f 70 72 69 61 74 65 20 74 61 72 67 65 74  propriate target
10240 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
10250 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20  ether or not.   
10260 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f     ** the RHS co
10270 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20  ntains a NULL.  
10280 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
10290 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
102a0 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73  , OP_If, rRhsHas
102b0 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
102c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
102d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
102e0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
102f0 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  False);..      /
10300 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61  * The OP_Found a
10310 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
10320 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68  s branch jumps h
10330 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a  ere when true, .
10340 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67        ** causing
10350 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20   the overall IN 
10360 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
10370 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68  ation to fall th
10380 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  rough..      */.
10390 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
103a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
103b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
103c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
103d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
103e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
103f0 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
10400 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
10410 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
10420 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
10430 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
10440 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
10450 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d   Duplicate an 8-
10460 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74  byte value.*/.st
10470 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62  atic char *dup8b
10480 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f  ytes(Vdbe *v, co
10490 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20  nst char *in){. 
104a0 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c   char *out = sql
104b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
104c0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
104d0 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  , 8);.  if( out 
104e0 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75  ){.    memcpy(ou
104f0 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20  t, in, 8);.  }. 
10500 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a   return out;.}..
10510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10520 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
10530 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
10540 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
10550 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
10560 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
10570 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
10580 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
10590 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
105a0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
105b0 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
105c0 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
105d0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
105e0 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
105f0 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
10600 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
10610 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
10620 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
10630 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
10640 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
10650 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
10660 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
10670 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
10680 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
10690 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
106a0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
106b0 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
106c0 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61  e value;.    cha
106d0 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74  r *zV;.    sqlit
106e0 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
106f0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
10700 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
10710 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
10720 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
10730 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
10740 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
10750 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
10760 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
10770 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
10780 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62  ;.    zV = dup8b
10790 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
107a0 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  value);.    sqli
107b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
107c0 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
107d0 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41  m, 0, zV, P4_REA
107e0 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
107f0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
10800 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
10810 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
10820 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
10830 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
10840 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
10850 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
10860 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  ** Expr.u.zToken
10870 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20   is always UTF8 
10880 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  and zero-termina
10890 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
108a0 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
108b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
108c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
108d0 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  negFlag, int iMe
108e0 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  m){.  Vdbe *v = 
108f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
10900 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
10910 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
10920 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
10930 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a  Expr->u.iValue;.
10940 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
10950 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46   );.    if( negF
10960 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
10970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10980 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10990 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  r, i, iMem);.  }
109a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
109b0 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  .    i64 value;.
109c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
109d0 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
109e0 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ken;.    assert(
109f0 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d   z!=0 );.    c =
10a00 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a   sqlite3Atoi64(z
10a10 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
10a20 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
10a30 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
10a40 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d  if( c==0 || (c==
10a50 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b  2 && negFlag) ){
10a60 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  .      char *zV;
10a70 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
10a80 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
10a90 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =2 ? SMALLEST_IN
10aa0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
10ab0 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
10ac0 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
10ad0 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
10ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10af0 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
10b00 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
10b10 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
10b20 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
10b30 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
10b40 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
10b50 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10b60 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
10b70 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
10b80 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
10b90 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , z);.#else.    
10ba0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
10bb0 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
10bc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
10bd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  }.}../*.** Clear
10be0 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a   a cache entry..
10bf0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10c00 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
10c10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
10c20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
10c30 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d  p){.  if( p->tem
10c40 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
10c50 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
10c60 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
10c70 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
10c80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
10c90 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
10ca0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e  TempReg++] = p->
10cb0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iReg;.    }.    
10cc0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
10cd0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65    }.}.../*.** Re
10ce0 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  cord in the colu
10cf0 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20  mn cache that a 
10d00 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d  particular colum
10d10 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74  n from a.** part
10d20 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20  icular table is 
10d30 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74  stored in a part
10d40 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
10d50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10d60 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50  ExprCacheStore(P
10d70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
10d80 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c  t iTab, int iCol
10d90 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
10da0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c  nt i;.  int minL
10db0 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75  ru;.  int idxLru
10dc0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
10dd0 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65  ache *p;..  asse
10de0 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f  rt( iReg>0 );  /
10df0 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65  * Register numbe
10e00 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
10e10 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65  sitive */.  asse
10e20 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
10e30 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
10e40 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
10e50 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
10e60 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
10e70 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
10e80 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
10e90 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
10ea0 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
10eb0 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
10ec0 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
10ed0 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
10ee0 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
10ef0 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
10f00 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
10f10 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
10f20 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
10f30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
10f40 6c 75 6d 6e 43 61 63 68 65 20 29 20 72 65 74 75  lumnCache ) retu
10f50 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
10f60 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
10f70 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
10f80 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
10f90 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
10fa0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
10fb0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
10fc0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
10fd0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
10fe0 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
10ff0 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
11000 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
11010 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
11020 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11030 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11040 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11050 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11060 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 23  HE; i++, p++){.#
11070 69 66 20 30 20 2f 2a 20 54 68 69 73 20 63 6f 64  if 0 /* This cod
11080 65 20 77 6f 6c 64 20 72 65 6d 6f 76 65 20 74 68  e wold remove th
11090 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  e entry from the
110a0 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
110b0 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  sted */.    if( 
110c0 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54  p->iReg && p->iT
110d0 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d  able==iTab && p-
110e0 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29  >iColumn==iCol )
110f0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
11100 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
11110 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65  p);.      p->iLe
11120 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
11130 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
11140 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
11150 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
11160 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
11170 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
11180 6e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  n;.    }.#endif.
11190 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
111a0 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61  Reg==0 || p->iTa
111b0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
111c0 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
111d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
111e0 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20  * Find an empty 
111f0 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65  slot and replace
11200 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30   it */.  for(i=0
11210 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11220 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11230 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
11240 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
11250 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->iReg==0 ){.   
11260 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
11270 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
11280 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61  el;.      p->iTa
11290 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
112a0 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
112b0 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  Col;.      p->iR
112c0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
112d0 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
112e0 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
112f0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
11300 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
11310 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
11320 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
11330 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
11340 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
11350 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
11360 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
11370 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11380 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
11390 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
113a0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
113b0 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
113c0 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
113d0 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
113e0 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
113f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
11400 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
11410 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
11420 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
11430 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
11440 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
11450 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
11460 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
11470 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
11480 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
11490 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
114a0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
114b0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
114c0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
114d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
114e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
114f0 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
11500 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
11510 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
11520 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
11530 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
11540 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
11550 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
11560 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
11570 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
11580 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
11590 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
115a0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
115b0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61  int i;.  int iLa
115c0 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67  st = iReg + nReg
115d0 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79   - 1;.  struct y
115e0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
115f0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
11600 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
11610 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
11620 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
11630 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
11640 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65  ;.    if( r>=iRe
11650 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b  g && r<=iLast ){
11660 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
11670 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
11680 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
11690 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
116a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
116b0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
116c0 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
116d0 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
116e0 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
116f0 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
11700 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
11710 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
11720 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
11730 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
11740 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
11750 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11760 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
11770 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
11780 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
11790 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
117a0 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
117b0 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65  cache any entrie
117c0 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65  s that were adde
117d0 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74  d since the.** t
117e0 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75  he previous N Pu
117f0 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  sh operations.  
11800 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
11810 72 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68  restore the cach
11820 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74  e.** to the stat
11830 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75  e it was in N Pu
11840 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69  shes ago..*/.voi
11850 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11860 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  hePop(Parse *pPa
11870 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  rse, int N){.  i
11880 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
11890 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
118a0 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20  ssert( N>0 );.  
118b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
118c0 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29  iCacheLevel>=N )
118d0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
118e0 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20  heLevel -= N;.  
118f0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11900 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11910 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11920 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
11930 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
11940 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73   p->iLevel>pPars
11950 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
11960 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
11970 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
11980 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
11990 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
119a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
119b0 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
119c0 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
119d0 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
119e0 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
119f0 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
11a00 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
11a10 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
11a20 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
11a30 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
11a40 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
11a50 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
11a60 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
11a70 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
11a80 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
11a90 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11aa0 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
11ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11ac0 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
11ad0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
11ae0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
11af0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11b00 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11b10 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11b20 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
11b30 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
11b40 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
11b50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
11b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
11b70 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
11b80 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
11b90 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
11ba0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
11bb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11bc0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
11bd0 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
11be0 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
11bf0 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
11c00 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
11c10 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
11c20 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
11c30 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
11c40 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
11c50 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  ,    /* The curs
11c60 6f 72 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  or for this tabl
11c70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  e */.  int iCol,
11c80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11c90 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
11ca0 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
11cb0 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
11cc0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
11cd0 75 64 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ud into this reg
11ce0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
11cf0 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
11d00 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
11d10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11d20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
11d30 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
11d40 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
11d50 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
11d60 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
11d70 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
11d80 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
11d90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
11da0 70 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  p, iTabCur, iCol
11db0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
11dc0 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
11dd0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
11de0 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
11df0 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
11e00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
11e10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
11e20 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
11e30 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
11e40 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
11e50 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
11e60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
11e70 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
11e80 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
11e90 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
11ea0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
11eb0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
11ec0 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
11ed0 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
11ee0 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
11ef0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
11f00 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
11f10 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
11f20 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
11f30 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
11f40 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
11f50 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
11f60 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
11f70 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
11f80 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
11f90 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
11fa0 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
11fb0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
11fc0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
11fd0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
11fe0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
11ff0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
12000 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
12010 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
12020 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
12030 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
12040 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
12050 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
12060 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
12070 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
12080 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
12090 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
120a0 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
120b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
120c0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
120d0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
120e0 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
120f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12100 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
12110 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
12120 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12130 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
12140 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
12150 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12160 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e      if( p->iReg>
12170 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  0 && p->iTable==
12180 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
12190 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
121a0 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
121b0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
121c0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
121d0 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
121e0 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
121f0 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
12200 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
12210 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
12220 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
12230 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
12240 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
12250 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
12260 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
12270 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12280 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
12290 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
122a0 20 69 52 65 67 29 3b 0a 20 20 72 65 74 75 72 6e   iReg);.  return
122b0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
122c0 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
122d0 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
122e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
122f0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
12300 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
12310 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
12320 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
12330 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
12340 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
12350 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
12360 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
12370 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
12380 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
12390 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
123a0 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
123b0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
123c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
123d0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
123e0 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
123f0 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
12400 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
12410 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
12420 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
12430 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12440 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
12450 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
12460 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
12470 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
12480 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
12490 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
124a0 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
124b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
124c0 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
124d0 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
124e0 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
124f0 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
12500 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
12510 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
12520 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
12530 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
12540 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
12550 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12560 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
12570 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
12580 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12590 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
125a0 20 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f    if( NEVER(iFro
125b0 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e  m==iTo) ) return
125c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
125d0 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
125e0 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
125f0 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
12600 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
12610 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
12620 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
12630 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
12640 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e  .    int x = p->
12650 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e  iReg;.    if( x>
12660 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f  =iFrom && x<iFro
12670 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20  m+nReg ){.      
12680 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69  p->iReg += iTo-i
12690 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  From;.    }.  }.
126a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
126b0 65 20 63 6f 64 65 20 74 6f 20 63 6f 70 79 20 63  e code to copy c
126c0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
126d0 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
126e0 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
126f0 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
12700 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Reg-1..*/.void s
12710 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
12720 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
12730 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
12740 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
12750 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
12760 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f  NEVER(iFrom==iTo
12770 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
12780 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69  r(i=0; i<nReg; i
12790 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
127a0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
127b0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
127c0 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b  y, iFrom+i, iTo+
127d0 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  i);.  }.}..#if d
127e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
127f0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
12800 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
12810 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
12820 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
12830 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
12840 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
12850 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
12860 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
12870 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
12880 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
12890 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
128a0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
128b0 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
128c0 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
128d0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
128e0 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
128f0 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
12900 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
12910 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
12920 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
12930 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
12940 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12950 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
12960 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12970 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12980 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12990 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
129a0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
129b0 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
129c0 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
129d0 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
129e0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
129f0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
12a00 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
12a10 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
12a20 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  EST */../*.** Ge
12a30 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
12a40 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
12a50 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
12a60 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
12a70 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20  ssion.  Attempt 
12a80 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
12a90 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
12aa0 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65   "target"..** Re
12ab0 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
12ac0 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20  r where results 
12ad0 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
12ae0 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74  * With this rout
12af0 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ine, there is no
12b00 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
12b10 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
12b20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
12b30 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
12b40 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
12b50 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
12b60 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
12b70 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
12b80 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
12b90 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
12ba0 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
12bb0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
12bc0 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
12bd0 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
12be0 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
12bf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
12c00 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
12c10 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
12c20 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
12c30 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
12c40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
12c50 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
12c60 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
12c70 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
12c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12c90 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
12ca0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
12cb0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
12cc0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
12cd0 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
12ce0 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
12cf0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
12d00 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
12d10 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
12d20 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
12d30 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
12d40 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
12d50 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
12d60 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
12d70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
12d80 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20  /.  int r1, r2, 
12d90 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a  r3, r4;       /*
12da0 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
12db0 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73  r numbers */.  s
12dc0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12dd0 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
12de0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12df0 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
12e00 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
12e10 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
12e20 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
12e30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12e40 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
12e50 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
12e60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
12e70 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
12e80 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
12e90 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
12ea0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
12eb0 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
12ec0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
12ed0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
12ee0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
12ef0 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
12f00 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
12f10 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
12f20 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
12f30 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
12f40 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
12f50 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
12f60 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
12f70 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
12f80 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
12f90 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
12fa0 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
12fb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
12fc0 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
12fd0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
12fe0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12ff0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13000 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
13010 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
13020 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
13050 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
13060 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13070 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
13080 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
13090 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
130a0 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
130b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
130c0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
130d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
130e0 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
130f0 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
13100 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
13110 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
13120 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
13130 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
13140 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Base>0 );.      
13150 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
13160 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
13170 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
13180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13190 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
131a0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
131b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
131c0 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
131f0 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
13200 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
13210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13220 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13230 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
13240 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
13250 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
13260 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
13270 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13290 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
132a0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
132b0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
132c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
132d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
132e0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
132f0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
13300 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13310 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
13320 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13330 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
13340 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
13350 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
13360 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13370 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
13380 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
13390 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
133a0 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
133b0 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
133c0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
133d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
133e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
133f0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
13400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13410 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
13420 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13430 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
13450 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
13460 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
13470 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
13480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
13490 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
134a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
134b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
134c0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
134d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
134e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
134f0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
13500 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13510 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
13520 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13530 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
13540 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
13550 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
13560 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
13570 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13580 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
13590 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
135a0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
135b0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
135c0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
135d0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
135e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
135f0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
13600 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
13610 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
13620 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13630 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13640 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
13650 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
13660 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
13670 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13680 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
13690 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
136a0 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
136b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
136c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
136d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
136e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
136f0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
13700 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
13710 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
13720 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13730 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
13740 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13750 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
13760 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
13770 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
13780 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
13790 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
137a0 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
137b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
137c0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
137d0 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
137e0 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
137f0 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
13800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13810 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13820 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
13830 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
13840 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
13850 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13860 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13870 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
13880 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
13890 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
138a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
138b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
138c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
138d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
138e0 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
138f0 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
13900 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
13910 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
13920 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
13930 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
13940 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
13950 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
13960 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13970 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13980 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
13990 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
139a0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
139b0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
139c0 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) );.      aff =
139d0 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
139e0 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
139f0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f  oken);.      to_
13a00 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54  op = aff - SQLIT
13a10 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f  E_AFF_TEXT + OP_
13a20 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73  ToText;.      as
13a30 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13a40 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66  ToText    || aff
13a50 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
13a60 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  T    );.      as
13a70 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13a80 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66  ToBlob    || aff
13a90 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
13aa0 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  E    );.      as
13ab0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13ac0 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
13ad0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
13ae0 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
13af0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13b00 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66  ToInt     || aff
13b10 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  !=SQLITE_AFF_INT
13b20 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73  EGER );.      as
13b30 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13b40 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66  ToReal    || aff
13b50 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  !=SQLITE_AFF_REA
13b60 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65  L    );.      te
13b70 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
13b80 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20  P_ToText );.    
13b90 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
13ba0 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a  p==OP_ToBlob );.
13bb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13bc0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
13bd0 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ric );.      tes
13be0 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
13bf0 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  _ToInt );.      
13c00 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
13c10 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20  =OP_ToReal );.  
13c20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
13c30 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
13c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13c50 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
13c60 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
13c70 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
13c80 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
13c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13ca0 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70  eAddOp1(v, to_op
13cb0 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
13cc0 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
13cd0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
13ce0 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
13cf0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
13d00 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13d10 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
13d20 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
13d30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13d40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13d50 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
13d60 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
13d70 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
13d80 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
13d90 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
13da0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
13db0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
13dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13dd0 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
13de0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
13df0 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
13e00 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
13e10 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
13e20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
13e30 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
13e40 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
13e50 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
13e60 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
13e70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13e80 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
13e90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13ea0 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
13eb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13ec0 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
13ed0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13ee0 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
13ef0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
13f00 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
13f10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
13f20 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
13f30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
13f40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13f50 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
13f60 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
13f70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
13f80 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
13f90 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
13fa0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
13fb0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
13fc0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
13fd0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
14000 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
14010 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14020 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
14030 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14040 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
14050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14060 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
14070 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
14080 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
14090 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
140a0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
140b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
140c0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
140d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
140e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
140f0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14100 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
14110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14120 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14130 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
14140 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
14150 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
14160 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
14170 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
14180 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14190 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
141a0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
141c0 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
141d0 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c  TE_STOREP2 | SQL
141e0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
141f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14200 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14210 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14220 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14240 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
14250 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
14260 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
14270 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
14280 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
14290 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
142a0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
142b0 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
142c0 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
142d0 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
142e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
142f0 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
14300 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
14310 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
14320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14330 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
14340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14350 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
14360 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
14370 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
14380 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14390 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
143a0 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
143b0 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
143c0 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
143d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
143e0 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
143f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14400 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
14410 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
14420 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
14430 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
14440 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
14450 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
14460 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14470 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
14480 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
14490 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
144a0 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
144b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
144c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
144d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
144e0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
144f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14500 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
14510 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14520 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
14530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14540 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
14550 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14560 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
14570 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14580 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
14590 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
145a0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
145b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
145c0 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
145d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
145e0 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
145f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14600 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
14610 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14620 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14630 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14640 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14650 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14660 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14670 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14680 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
14690 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
146a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
146b0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
146c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
146d0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
146e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
146f0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14710 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14720 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
14730 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14740 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
14750 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
14760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
14770 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
14780 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
14790 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
147a0 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
147b0 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  et);.#ifndef SQL
147c0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
147d0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
147e0 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
147f0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
14800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
14810 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14820 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14830 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
14840 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
14850 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
14860 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20  arget);.#endif. 
14870 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14880 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72      regFree1 = r
14890 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
148a0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
148b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
148c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
148d0 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a  nteger, 0, r1);.
148e0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
148f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14900 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14910 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
14920 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14930 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14940 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
14950 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
14960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14970 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
14990 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
149a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
149b0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
149c0 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
149d0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
149e0 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
149f0 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20  OP_BitNot );.   
14a00 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
14a10 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20  T==OP_Not );.   
14a20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14a30 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
14a40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14a50 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
14a60 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
14a70 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14a80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14a90 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
14aa0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14ab0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14ac0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
14ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14ae0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
14af0 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
14b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14b10 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
14b20 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
14b30 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
14b40 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
14b50 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
14b60 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
14b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14b80 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
14b90 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74  tNull );.      t
14ba0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14bb0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
14bc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14bd0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
14be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bf0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14c00 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
14c10 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14c20 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14c30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14c40 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
14c50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14c60 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14c70 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14c80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14c90 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
14ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14cb0 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
14cc0 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20  target, -1);.   
14cd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14ce0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
14cf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14d10 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
14d20 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
14d30 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
14d40 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
14d50 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
14d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
14d70 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14d80 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
14d90 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e) );.        sq
14da0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14db0 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
14dc0 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29   aggregate: %s()
14dd0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
14de0 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
14df0 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
14e00 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
14e10 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
14e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14e30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14e40 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
14e50 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
14e60 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
14e70 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
14e80 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
14e90 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
14ea0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
14eb0 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
14ec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14ed0 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
14ee0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
14ef0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
14f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
14f10 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
14f20 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
14f30 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
14f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
14f50 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74  gth of the funct
14f60 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  ion name in byte
14f70 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  s */.      const
14f80 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
14f90 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
14fa0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
14fb0 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
14fc0 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
14fd0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
14fe0 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
14ff0 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
15000 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
15010 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15020 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
15030 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
15040 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
15050 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
15060 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
15070 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
15080 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
15090 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
150a0 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
150b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
150c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
150d0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
150e0 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ) );.      testc
150f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53  ase( op==TK_CONS
15100 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20  T_FUNC );.      
15110 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15120 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
15130 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e     if( ExprHasAn
15140 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
15150 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
15160 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
15170 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
15180 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
15190 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
151a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
151b0 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
151c0 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
151d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
151e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
151f0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15200 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
15210 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
15220 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
15230 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15240 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
15250 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
15260 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
15270 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
15280 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15290 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
152a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
152b0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
152c0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  own function: %.
152d0 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
152e0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
152f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15300 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
15310 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
15320 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
15330 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
15340 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
15350 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
15360 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
15370 63 65 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f  cessary evalatio
15380 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
15390 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
153a0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
153b0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
153c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
153d0 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
153e0 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
153f0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
15400 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
15410 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15420 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
15430 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
15440 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15450 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
15460 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
15470 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
15480 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
15490 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
154a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
154b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
154c0 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
154d0 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
154e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
154f0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
15500 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
15510 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
15520 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
15530 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
15540 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15550 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
15560 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
15570 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15580 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15590 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
155a0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
155b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
155c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
155d0 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
155e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
155f0 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66      }...      if
15600 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
15610 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
15620 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
15630 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
15640 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15650 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
15660 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
15670 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
15680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15690 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
156a0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
156b0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 1);.        s
156c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
156d0 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20  op(pParse, 1);  
156e0 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
156f0 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
15700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15710 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
15720 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15730 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15740 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
15750 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
15760 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
15770 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
15780 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
15790 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
157a0 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
157b0 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
157c0 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
157d0 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
157e0 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
157f0 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
15800 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
15810 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
15820 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
15830 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
15840 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
15850 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
15860 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
15870 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
15880 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
15890 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
158a0 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
158b0 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
158c0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
158d0 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
158e0 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
158f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
15900 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
15910 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
15920 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
15930 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
15940 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
15950 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
15960 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
15970 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
15980 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
15990 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
159a0 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
159b0 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
159c0 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
159d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
159e0 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
159f0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
15a00 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
15a10 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
15a20 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
15a30 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
15a40 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
15a50 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
15a60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15a70 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
15a80 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
15a90 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
15aa0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
15ab0 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
15ac0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
15ad0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15ae0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
15af0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
15b00 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
15b10 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
15b20 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
15b30 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
15b40 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
15b50 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20   (1<<i);.       
15b60 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
15b70 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
15b80 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
15b90 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
15ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
15bb0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
15bc0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
15bd0 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
15be0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
15bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15c00 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53   pDef->flags & S
15c10 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
15c20 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
15c30 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
15c40 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15c50 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
15c60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15c70 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
15c80 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
15c90 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
15ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15cc0 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
15cd0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
15ce0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
15d10 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
15d20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15d30 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
15d40 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
15d50 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  arg ){.        s
15d60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15d70 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
15d80 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
15d90 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
15da0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
15db0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15dc0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
15dd0 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
15de0 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
15df0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15e00 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
15e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15e20 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
15e30 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
15e40 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
15e50 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
15e60 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
15e70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15e80 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
15e90 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
15ea0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
15eb0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15ec0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
15ed0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
15ee0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15f10 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15f20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15f30 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
15f40 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
15f50 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
15f60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15f70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
15f80 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
15f90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15fa0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15fb0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
15fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
15fe0 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
15ff0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16000 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16010 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
16020 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16030 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
16040 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16050 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20  RY */...    /*. 
16060 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
16070 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
16080 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
16090 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
160a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
160b0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
160c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
160d0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
160e0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
160f0 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
16100 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
16110 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
16120 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
16130 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
16140 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
16150 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
16160 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
16170 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
16180 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
16190 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
161a0 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
161b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b  xpr->x.pList->a;
161c0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
161d0 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
161e0 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d  xpr;..      r1 =
161f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16200 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
16210 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16220 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16230 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16240 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
16250 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
16260 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16270 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
16280 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16290 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e2==0 );.      r
162a0 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
162b0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
162c0 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65       r4 = sqlite
162d0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
162e0 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  se);.      codeC
162f0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
16300 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
16310 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _Ge,.           
16320 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72         r1, r2, r
16330 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  3, SQLITE_STOREP
16340 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  2);.      pLItem
16350 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
16360 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
16370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16380 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16390 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
163a0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
163b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
163c0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
163d0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
163e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
163f0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
16400 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
16410 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
16420 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
16430 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54  2, r4, SQLITE_ST
16440 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71  OREP2);.      sq
16450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16460 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
16470 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  4, target);.    
16480 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16490 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
164a0 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r3);.      sqlit
164b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
164c0 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20  (pParse, r4);.  
164d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
164e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
164f0 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
16500 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
16510 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
16520 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
16530 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
16540 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16550 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
16560 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
16570 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
16580 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
16590 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
165a0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
165b0 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
165c0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
165d0 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
165e0 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
165f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
16600 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
16610 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
16620 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
16630 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
16640 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
16650 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
16660 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
16670 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
16680 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
16690 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
166a0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
166b0 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
166c0 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
166d0 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
166e0 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
166f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
16700 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
16710 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
16720 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
16730 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
16740 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
16750 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
16760 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
16770 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
16780 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
16790 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
167a0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
167b0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
167c0 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
167d0 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
167e0 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
167f0 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
16800 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
16810 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
16820 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
16830 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
16840 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
16850 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
16860 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
16870 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
16880 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
16890 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
168a0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
168b0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
168c0 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
168d0 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
168e0 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
168f0 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
16900 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
16910 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
16920 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
16930 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
16940 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
16950 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16960 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
16970 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
16980 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
16990 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
169a0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
169b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
169c0 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
169d0 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
169e0 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
169f0 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
16a00 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
16a10 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
16a20 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
16a30 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
16a40 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
16a50 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
16a60 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
16a70 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
16a80 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
16a90 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
16aa0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
16ab0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
16ac0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
16ad0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
16ae0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
16af0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
16b00 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
16b10 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
16b20 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
16b30 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
16b40 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
16b50 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
16b60 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
16b70 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
16b80 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
16b90 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
16ba0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
16bb0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
16bc0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
16bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16be0 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
16bf0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
16c00 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
16c10 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
16c20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
16c30 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
16c40 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
16c50 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
16c60 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
16c70 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
16c80 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
16c90 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
16ca0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
16cb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16cc0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
16cd0 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
16ce0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
16cf0 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
16d00 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
16d10 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
16d20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
16d30 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
16d40 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
16d50 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
16d60 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  real.  */.      
16d70 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
16d80 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
16d90 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
16da0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
16db0 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
16dc0 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
16dd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16de0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
16df0 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
16e00 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
16e10 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
16e20 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
16e30 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
16e40 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
16e50 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
16e60 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
16e70 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
16e80 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
16e90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
16ea0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
16eb0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
16ec0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
16ed0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
16ee0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
16ef0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
16f00 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
16f10 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
16f20 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
16f30 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
16f40 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
16f50 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
16f60 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
16f70 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
16f80 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
16f90 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
16fa0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
16fb0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
16fc0 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
16fd0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
16fe0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52   is in pExpr->pR
16ff0 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20  ight.  The Y is 
17000 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
17010 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  If there is no. 
17020 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73     ** ELSE claus
17030 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74  e and no other t
17040 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65  erm matches, the
17050 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
17060 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73  the.    ** exprs
17070 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sion is NULL..  
17080 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
17090 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
170a0 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
170b0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
170c0 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
170d0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
170e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
170f0 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
17100 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
17110 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
17120 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
17130 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
17140 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
17150 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
17160 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
17170 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
17180 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17190 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
171a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
171b0 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
171c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
171d0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
171e0 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
171f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
17200 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
17210 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
17220 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
17230 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
17240 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
17270 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
17280 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
17290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
172b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
172c0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
172d0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
172e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
172f0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
17300 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
17310 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
17320 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
17330 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
17340 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
17350 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
17360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17370 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
17380 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
17390 20 63 61 63 68 65 58 3b 20 20 20 20 20 20 20 20   cacheX;        
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
173b0 20 43 61 63 68 65 64 20 65 78 70 72 65 73 73 69   Cached expressi
173c0 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78  on X */.      Ex
173d0 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
17400 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
17410 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17430 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
17440 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
17450 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
17460 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
17470 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
17480 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
17490 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
174a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
174b0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
174c0 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
174d0 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
174e0 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
174f0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  x.pList->nExpr %
17500 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
17510 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
17520 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
17530 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
17540 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
17550 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
17560 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
17570 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
17580 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
17590 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
175a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
175b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
175c0 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
175d0 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
175e0 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70 58 3b     cacheX = *pX;
175f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17600 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
17610 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
17620 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
17630 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
17640 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
17650 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
17660 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17670 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
17680 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e1);.        tes
17690 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
176a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  =0 );.        ca
176b0 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  cheX.op = TK_REG
176c0 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20 6f  ISTER;.        o
176d0 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
176e0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
176f0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
17700 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20  cacheX;.        
17710 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
17720 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
17730 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
17740 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
17750 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
17760 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
17770 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
17780 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
17790 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
177a0 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
177b0 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
177c0 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
177d0 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
177e0 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
177f0 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
17800 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
17810 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
17820 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
17830 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
17840 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
17850 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
17860 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
17870 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
17880 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
17890 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
178a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
178b0 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
178c0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
178d0 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
178e0 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
178f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17900 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
17910 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
17920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17930 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
17940 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17950 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
17960 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
17970 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
17980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17990 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
179a0 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
179b0 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
179c0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
179d0 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
179e0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
179f0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
17a00 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17a10 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
17a20 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
17a30 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
17a40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17a50 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
17a60 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
17a70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
17a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17a90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
17aa0 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  , 0, endLabel);.
17ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17ac0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
17ad0 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  se, 1);.        
17ae0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17af0 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
17b00 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
17b10 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
17b20 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
17b30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17b40 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
17b50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17b60 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
17b70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
17b80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
17b90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17ba0 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
17bb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17bd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
17be0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
17bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
17c00 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
17c10 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
17c20 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20  nErr>0 .        
17c30 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43     || pParse->iC
17c40 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68  acheLevel==iCach
17c50 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  eLevel );.      
17c60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17c70 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
17c80 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
17c90 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
17ca0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
17cb0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
17cc0 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
17cd0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
17ce0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
17cf0 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
17d00 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
17d10 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
17d20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
17d30 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
17d40 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
17d50 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
17d60 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
17d70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
17d80 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
17d90 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
17da0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17db0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dd0 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
17de0 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
17df0 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
17e00 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
17e10 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
17e20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17e30 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
17e40 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
17e50 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
17e60 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
17e70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
17e80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17e90 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
17ea0 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
17eb0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
17ec0 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
17ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17ee0 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
17ef0 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
17f00 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
17f10 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
17f20 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
17f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17f40 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
17f50 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
17f60 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
17f70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
17f80 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  n, 0);.      }..
17f90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17fa0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
17fb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17fc0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
17fd0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
17fe0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17ff0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
18000 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
18010 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
18020 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
18030 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
18040 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
18050 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
18060 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
18070 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
18080 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
18090 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
180a0 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
180b0 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
180c0 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
180d0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
180e0 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
180f0 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
18100 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
18110 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
18120 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
18130 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
18140 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
18150 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
18160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
18170 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
18180 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
18190 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
181a0 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
181b0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
181c0 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32  Parse);.  int r2
181d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
181e0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
181f0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69   pExpr, r1);.  i
18200 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
18210 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d   *pReg = r1;.  }
18220 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
18230 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18240 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
18250 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a   *pReg = 0;.  }.
18260 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
18270 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
18280 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
18290 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
182a0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
182b0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
182c0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
182d0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
182e0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
182f0 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
18300 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
18310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18320 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
18330 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
18340 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
18350 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
18360 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
18370 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
18380 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
18390 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
183a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
183b0 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
183c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
183d0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
183e0 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
183f0 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
18400 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
18410 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18420 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
18430 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18440 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
18450 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61  se->pVdbe || pPa
18460 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
18470 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
18480 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
18490 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
184a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
184b0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
184c0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
184d0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
184e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
184f0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d  return target;.}
18500 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18510 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
18520 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
18530 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
18540 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
18550 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
18560 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
18570 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
18580 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
18590 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
185a0 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
185b0 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
185c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
185d0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
185e0 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
185f0 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
18600 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
18610 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
18620 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
18630 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
18640 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
18650 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
18660 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
18670 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
18680 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
18690 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
186a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
186b0 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
186c0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
186d0 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
186e0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
186f0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
18700 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
18710 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
18720 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69    int inReg;.  i
18730 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
18740 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
18750 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
18760 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
18770 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 72  0 );.  /* This r
18780 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18790 20 66 6f 72 20 74 65 72 6d 73 20 74 6f 20 49 4e   for terms to IN
187a0 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 2e 20  SERT or UPDATE. 
187b0 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a 20 20   And the only.  
187c0 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63 65 20 77  ** other place w
187d0 68 65 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73  here expressions
187e0 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65   can be converte
187f0 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49 53 54  d into TK_REGIST
18800 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20 57 48  ER is.  ** in WH
18810 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
18820 73 73 69 6e 67 2e 20 20 53 6f 20 61 73 20 63 75  ssing.  So as cu
18830 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d 65 6e  rrently implemen
18840 74 65 64 2c 20 74 68 65 72 65 20 69 73 0a 20 20  ted, there is.  
18850 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20 61 20  ** no way for a 
18860 54 4b 5f 52 45 47 49 53 54 45 52 20 74 6f 20 65  TK_REGISTER to e
18870 78 69 73 74 20 68 65 72 65 2e 20 20 42 75 74 20  xist here.  But 
18880 69 74 20 73 65 65 6d 73 20 70 72 75 64 65 6e 74  it seems prudent
18890 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 74 68   to.  ** keep th
188a0 65 20 41 4c 57 41 59 53 28 29 20 69 6e 20 63 61  e ALWAYS() in ca
188b0 73 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  se the condition
188c0 73 20 61 62 6f 76 65 20 63 68 61 6e 67 65 20 77  s above change w
188d0 69 74 68 20 66 75 74 75 72 65 0a 20 20 2a 2a 20  ith future.  ** 
188e0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 6f 72  modifications or
188f0 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e 20 2a   enhancements. *
18900 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
18910 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
18920 49 53 54 45 52 29 20 29 7b 20 20 0a 20 20 20 20  ISTER) ){  .    
18930 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d  int iMem;.    iM
18940 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
18950 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
18960 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18970 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d  _Copy, inReg, iM
18980 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  em);.    pExpr->
18990 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20  iTable = iMem;. 
189a0 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
189b0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
189c0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
189d0 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65  GISTER;.  }.  re
189e0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 23  turn inReg;.}..#
189f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
18a00 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 47  E_DEBUG)./*.** G
18a10 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
18a20 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61  readable explana
18a30 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65  tion of an expre
18a40 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
18a50 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61  oid sqlite3Expla
18a60 69 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75  inExpr(Vdbe *pOu
18a70 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  t, Expr *p){.  i
18a80 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
18a90 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
18aa0 6e 74 66 28 70 4f 75 74 2c 20 22 28 43 2d 6e 75  ntf(pOut, "(C-nu
18ab0 6c 6c 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ll)");.    retur
18ac0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78  n;.  }.  if( !Ex
18ad0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
18ae0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
18af0 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
18b00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
18b10 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
18b20 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  (%s", p->u.zToke
18b30 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
18b40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
18b50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 6f 70  rintf(pOut, "(op
18b60 3d 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20  =%d", p->op);.  
18b70 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74  }.  if( p->pLeft
18b80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18b90 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
18ba0 74 2c 20 22 20 6c 65 66 74 3d 22 29 3b 0a 20 20  t, " left=");.  
18bb0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
18bc0 45 78 70 72 28 70 4f 75 74 2c 20 70 2d 3e 70 4c  Expr(pOut, p->pL
18bd0 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
18be0 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  p->pRight ){.   
18bf0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
18c00 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 72 69  rintf(pOut, " ri
18c10 67 68 74 3d 22 29 3b 0a 20 20 20 20 73 71 6c 69  ght=");.    sqli
18c20 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
18c30 4f 75 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  Out, p->pRight);
18c40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
18c50 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
18c60 2c 20 22 29 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  , ")");.}.#endif
18c70 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
18c80 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a 0a 23 69  TE_DEBUG) */..#i
18c90 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
18ca0 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 47 65  _DEBUG)./*.** Ge
18cb0 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
18cc0 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74  eadable explanat
18cd0 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ion of an expres
18ce0 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
18cf0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
18d00 6e 45 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a  nExprList(Vdbe *
18d10 70 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  pOut, ExprList *
18d20 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
18d30 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
18d40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
18d50 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
18d60 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22  , "(empty-list)"
18d70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
18d80 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c   }.  sqlite3Expl
18d90 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
18da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
18db0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18dc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
18dd0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
18de0 25 30 32 64 3a 20 22 2c 20 69 29 3b 0a 20 20 20  %02d: ", i);.   
18df0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
18e00 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 73  ush(pOut);.    s
18e10 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
18e20 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61  r(pOut, pList->a
18e30 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
18e40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
18e50 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  p(pOut);.    if(
18e60 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d   i<pList->nExpr-
18e70 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
18e80 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74  e3ExplainNL(pOut
18e90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
18ea0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
18eb0 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
18ec0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
18ed0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
18ee0 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72 20  n TRUE if pExpr 
18ef0 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65  is an constant e
18f00 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
18f10 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  s appropriate.**
18f20 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f   for factoring o
18f30 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41  ut of a loop.  A
18f40 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72 65  ppropriate expre
18f50 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ssions are:.**.*
18f60 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72  *    *  Any expr
18f70 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c  ession that eval
18f80 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20  uates to two or 
18f90 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a  more opcodes..**
18fa0 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50  .**    *  Any OP
18fb0 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61  _Integer, OP_Rea
18fc0 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50  l, OP_String, OP
18fd0 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  _Blob, OP_Null, 
18fe0 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f  .**       or OP_
18ff0 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f  Variable that do
19000 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
19010 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a  e placed in a .*
19020 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63  *       specific
19030 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
19040 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
19050 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20  nt in factoring 
19060 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72  out single-instr
19070 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a  uction constant.
19080 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
19090 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  hat need to be p
190a0 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74 69  laced in a parti
190b0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20  cular register. 
190c0 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61   .** We could fa
190d0 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62  ctor them out, b
190e0 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64  ut then we would
190f0 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61   end up adding a
19100 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e  n.** OP_SCopy in
19110 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76  struction to mov
19120 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  e the value into
19130 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 67   the correct reg
19140 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20  ister.** later. 
19150 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
19160 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f  l just use the o
19170 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74  riginal instruct
19180 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64  ion and.** avoid
19190 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a   the OP_SCopy..*
191a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
191b0 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
191c0 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b  toring(Expr *p){
191d0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
191e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
191f0 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72  Join(p) ){.    r
19200 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c  eturn 0;  /* Onl
19210 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  y constant expre
19220 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f  ssions are appro
19230 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f  priate for facto
19240 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ring */.  }.  if
19250 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
19260 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29  _FixedDest)==0 )
19270 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  {.    return 1; 
19280 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74   /* Any constant
19290 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65 64   without a fixed
192a0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
192b0 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20  appropriate */. 
192c0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f   }.  while( p->o
192d0 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20  p==TK_UPLUS ) p 
192e0 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77  = p->pLeft;.  sw
192f0 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23  itch( p->op ){.#
19300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19310 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
19320 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
19330 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
19340 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
19350 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
19360 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
19370 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
19380 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  TK_NULL:.    cas
19390 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
193a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
193b0 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b  ->op==TK_BLOB );
193c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
193d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41   p->op==TK_VARIA
193e0 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BLE );.      tes
193f0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
19400 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
19410 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
19420 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20  p==TK_FLOAT );. 
19430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19440 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b  ->op==TK_NULL );
19450 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19460 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
19470 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69  G );.      /* Si
19480 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
19490 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   constants with 
194a0 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
194b0 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ion are.      **
194c0 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d   better done in-
194d0 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63  line.  If we fac
194e0 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77  tor them, they w
194f0 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20  ill just end.   
19500 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74     ** up generat
19510 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20  ing an OP_SCopy 
19520 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
19530 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61  e to the destina
19540 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65  tion.      ** re
19550 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gister. */.     
19560 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
19570 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
19580 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NUS: {.      if(
19590 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
195a0 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c  K_FLOAT || p->pL
195b0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
195c0 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72  GER ){.        r
195d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
195e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
195f0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
19600 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   {.      break;.
19610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19620 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
19630 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
19640 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
19650 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
19660 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74  iate for.** fact
19670 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c  oring out of a l
19680 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  oop, then evalua
19690 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
196a0 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  n.** into a regi
196b0 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ster and convert
196c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
196d0 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  into a TK_REGIST
196e0 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ER.** expression
196f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19700 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57 61  evalConstExpr(Wa
19710 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
19720 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 50  xpr *pExpr){.  P
19730 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
19740 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
19750 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
19760 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
19770 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20  TK_IN:.    case 
19780 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
19790 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
197a0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
197b0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
197c0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
197d0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
197e0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
197f0 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UNC: {.      /* 
19800 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
19810 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65   a function have
19820 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
19830 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  tion..      ** M
19840 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61  ark them this wa
19850 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72  y to avoid gener
19860 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50  ated unneeded OP
19870 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  _SCopy.      ** 
19880 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20  instructions. . 
19890 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
198a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
198b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
198c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
198d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
198e0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
198f0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
19900 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
19910 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
19920 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
19930 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19940 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c  item *pItem = pL
19950 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
19960 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  for(; i>0; i--, 
19970 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
19980 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
19990 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20 70  Item->pExpr) ) p
199a0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61  Item->pExpr->fla
199b0 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65  gs |= EP_FixedDe
199c0 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  st;.        }.  
199d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
199e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
199f0 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  f( isAppropriate
19a00 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78  ForFactoring(pEx
19a10 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  pr) ){.    int r
19a20 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
19a30 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a  em;.    int r2;.
19a40 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
19a50 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
19a60 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
19a70 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
19a80 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c 69 74  (r1!=r2) ) sqlit
19a90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19aa0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19ab0 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70    pExpr->op2 = p
19ac0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
19ad0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
19ae0 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72  ISTER;.    pExpr
19af0 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20  ->iTable = r2;. 
19b00 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
19b10 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
19b20 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
19b30 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c  }../*.** Preeval
19b40 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75  uate constant su
19b50 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74  bexpressions wit
19b60 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  hin pExpr and st
19b70 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
19b80 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e  ts in registers.
19b90 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73    Modify pExpr s
19ba0 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  o that the const
19bb0 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e  ant subexpresion
19bc0 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49  s.** are TK_REGI
19bd0 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61  STER opcodes tha
19be0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 70  t refer to the p
19bf0 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65  recomputed value
19c00 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
19c10 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19c20 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f 20   if the jump to 
19c30 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b  the cookie-check
19c40 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c 72   code has.** alr
19c50 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69 6e  eady occur.  Sin
19c60 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68  ce the cookie-ch
19c70 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e 65  eck jump is gene
19c80 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a 2a  rated prior to.*
19c90 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72 69  * any other seri
19ca0 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c 20  ous processing, 
19cb0 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75 72  this check ensur
19cc0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
19cd0 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61 63   no.** way to ac
19ce0 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73 20  cidently bypass 
19cf0 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 69  the constant ini
19d00 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a 2a  tializations..**
19d10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19d20 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f 70   is also a no-op
19d30 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 46   if the SQLITE_F
19d40 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f 70  actorOutConst op
19d50 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73  timization.** is
19d60 20 64 69 73 61 62 6c 65 64 20 76 69 61 20 74 68   disabled via th
19d70 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  e sqlite3_test_c
19d80 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19d90 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
19da0 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66 61  IONS).** interfa
19db0 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ce.  This allows
19dc0 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20 76   test logic to v
19dd0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
19de0 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a 2a  ame answer is.**
19df0 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71 75   obtained for qu
19e00 65 72 69 65 73 20 72 65 67 61 72 64 6c 65 73 73  eries regardless
19e10 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
19e20 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  ot constants are
19e30 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64 20  .** precomputed 
19e40 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 6f  into registers o
19e50 72 20 69 66 20 74 68 65 79 20 61 72 65 20 69 6e  r if they are in
19e60 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e 0a  serted in-line..
19e70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
19e80 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
19e90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19ea0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
19eb0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28 20  Walker w;.  if( 
19ec0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
19ed0 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  to ) return;.  i
19ee0 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
19ef0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
19f00 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 21 3d  actorOutConst)!=
19f10 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 2e  0 ) return;.  w.
19f20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
19f30 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20  evalConstExpr;. 
19f40 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
19f50 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72  ck = 0;.  w.pPar
19f60 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
19f70 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
19f80 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f  w, pExpr);.}.../
19f90 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
19fa0 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
19fb0 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
19fc0 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
19fd0 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
19fe0 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
19ff0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
1a000 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
1a010 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
1a020 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1a030 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1a040 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e  evaluated..*/.in
1a050 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1a060 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
1a070 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a080 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1a090 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
1a0a0 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
1a0b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
1a0c0 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
1a0d0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
1a0e0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1a0f0 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
1a100 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43  */.  int doHardC
1a110 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  opy     /* Make 
1a120 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65  a hard copy of e
1a130 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  very element */.
1a140 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
1a150 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a160 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
1a170 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
1a180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
1a190 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
1a1a0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
1a1b0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
1a1c0 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
1a1d0 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
1a1e0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1a1f0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1a200 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b  st->a, i=0; i<n;
1a210 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1a220 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1a230 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
1a240 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
1a250 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1a260 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1a270 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
1a280 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1a290 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
1a2a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a2b0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1a2c0 2c 20 64 6f 48 61 72 64 43 6f 70 79 20 3f 20 4f  , doHardCopy ? O
1a2d0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
1a2e0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1a2f0 20 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67             inReg
1a300 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
1a310 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a320 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
1a330 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1a340 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
1a350 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
1a360 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
1a370 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
1a380 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
1a390 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
1a3a0 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
1a3b0 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
1a3c0 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
1a3d0 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
1a3e0 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65  ression.** eleme
1a3f0 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f  ntation of x..*/
1a400 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1a410 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20  rCodeBetween(.  
1a420 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1a430 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1a440 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1a450 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1a460 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
1a470 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65  /* The BETWEEN e
1a480 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1a490 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1a4a0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1a4b0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
1a4c0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  en */.  int jump
1a4d0 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b  IfTrue,   /* Tak
1a4e0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1a4f0 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75  e BETWEEN is tru
1a500 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
1a510 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
1a520 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1a530 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
1a540 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78   */.){.  Expr ex
1a550 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
1a560 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
1a570 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
1a580 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
1a590 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
1a5a0 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
1a5b0 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
1a5c0 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
1a5d0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
1a5e0 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
1a5f0 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
1a600 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
1a610 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
1a620 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
1a630 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  gister */..  ass
1a640 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1a650 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1a660 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1a670 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
1a680 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1a690 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1a6a0 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
1a6b0 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
1a6c0 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
1a6d0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
1a6e0 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
1a6f0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
1a700 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1a710 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
1a720 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1a730 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
1a740 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
1a750 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
1a760 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1a770 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
1a780 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
1a790 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
1a7a0 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20  .  exprX.iTable 
1a7b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1a7c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1a7d0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1a7e0 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54  ;.  exprX.op = T
1a7f0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 69 66  K_REGISTER;.  if
1a800 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a  ( jumpIfTrue ){.
1a810 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a820 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
1a830 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1a840 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
1a850 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1a860 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1a870 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1a880 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1a890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1a8a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a8b0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a  se, regFree1);..
1a8c0 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71    /* Ensure adeq
1a8d0 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61  uate test covera
1a8e0 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ge */.  testcase
1a8f0 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1a900 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1a910 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1a920 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1a930 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1a940 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1a950 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1a960 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a970 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1a980 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1a990 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1a9a0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a9b0 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1a9c0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1a9d0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1a9e0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a9f0 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1aa00 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1aa10 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1aa20 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1aa30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1aa40 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1aa50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1aa60 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1aa70 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1aa80 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1aa90 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1aaa0 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1aab0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1aac0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a  egFree1!=0 );.}.
1aad0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1aae0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1aaf0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1ab00 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1ab10 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1ab20 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1ab30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1ab40 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
1ab50 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
1ab60 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
1ab70 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1ab80 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
1ab90 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1aba0 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1abb0 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1abc0 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
1abd0 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
1abe0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
1abf0 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
1ac00 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1ac10 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
1ac20 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1ac30 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
1ac40 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
1ac50 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
1ac60 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
1ac70 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
1ac80 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
1ac90 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
1aca0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
1acb0 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
1acc0 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
1acd0 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
1ace0 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
1acf0 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
1ad00 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
1ad10 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
1ad20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
1ad30 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
1ad40 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
1ad50 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
1ad60 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
1ad70 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
1ad80 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1ad90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1ada0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1adb0 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
1adc0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
1add0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1ade0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
1adf0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1ae00 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1ae10 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
1ae20 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
1ae30 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
1ae40 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
1ae50 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
1ae60 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
1ae70 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72  ==0) )     retur
1ae80 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63 65  n;  /* Existance
1ae90 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
1aea0 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
1aeb0 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
1aec0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
1aed0 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61  * No way this ca
1aee0 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70  n happen */.  op
1aef0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1af00 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1af10 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1af20 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1af30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1af40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1af50 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1af60 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1af70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1af80 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1af90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1afa0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1afb0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
1afc0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1afd0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1afe0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1aff0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1b000 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1b010 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1b020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b030 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b040 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
1b050 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1b060 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
1b070 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b080 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1b090 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1b0a0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1b0b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b0c0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1b0d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1b0e0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1b0f0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1b100 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1b110 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1b120 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1b130 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1b140 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1b150 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1b160 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1b170 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1b180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1b190 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1b1a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1b1b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1b1c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b1d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1b1e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1b1f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1b200 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1b210 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1b220 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1b230 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1b240 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
1b250 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b260 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
1b270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1b280 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
1b290 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
1b2a0 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
1b2b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
1b2c0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
1b2d0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
1b2e0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
1b2f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1b300 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1b310 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
1b320 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b330 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
1b340 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1b350 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
1b360 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1b370 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
1b380 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1b390 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
1b3a0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1b3b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1b3c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1b3d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1b3e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1b3f0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1b400 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b410 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1b420 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1b430 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1b440 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1b450 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1b460 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1b470 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1b480 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1b490 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1b4a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b4b0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1b4c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b4d0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1b4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b4f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1b500 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1b510 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1b520 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1b530 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1b540 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
1b550 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1b560 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b570 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1b580 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1b590 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1b5a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b5b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1b5c0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1b5d0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
1b5e0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1b5f0 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1b600 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1b610 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1b620 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1b630 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1b650 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1b660 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1b670 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1b680 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1b690 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1b6a0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1b6b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b6c0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1b6d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1b6e0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
1b6f0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1b700 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
1b710 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1b720 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1b730 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
1b740 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1b750 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
1b760 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1b770 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1b780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b790 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1b7a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1b7b0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1b7c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b7d0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1b7e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b7f0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1b800 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b810 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1b820 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1b830 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1b840 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1b850 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1b860 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1b870 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49  , dest, 1, jumpI
1b880 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1b890 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1b8a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b8b0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1b8c0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1b8d0 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
1b8e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b8f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1b900 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1b910 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
1b920 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
1b930 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
1b940 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1b950 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
1b960 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
1b970 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1b980 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b990 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
1b9a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b9b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b9c0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1b9d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b9e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1b9f0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1ba00 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ba10 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ba20 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1ba30 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1ba40 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ba50 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
1ba60 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1ba70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ba80 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1ba90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1baa0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1bab0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bac0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1bad0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1bae0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1baf0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1bb00 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1bb10 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
1bb20 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1bb30 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1bb40 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1bb50 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1bb60 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1bb70 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1bb80 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1bb90 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
1bba0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1bbb0 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1bbc0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1bbd0 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
1bbe0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1bbf0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1bc00 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1bc10 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1bc20 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
1bc30 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
1bc40 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1bc50 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
1bc60 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
1bc70 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
1bc80 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1bc90 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1bca0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1bcb0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1bcc0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1bcd0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1bce0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1bcf0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1bd00 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1bd10 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1bd20 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1bd30 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1bd40 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1bd50 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1bd60 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1bd70 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
1bd80 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f  ; /* Existance o
1bd90 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
1bda0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
1bdb0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
1bdc0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
1bdd0 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
1bde0 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
1bdf0 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
1be00 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1be10 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
1be20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
1be30 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
1be40 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
1be50 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
1be60 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
1be70 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
1be80 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
1be90 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
1bea0 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
1beb0 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
1bec0 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
1bed0 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
1bee0 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
1bef0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
1bf10 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1bf20 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1bf30 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
1bf40 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
1bf50 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
1bf60 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
1bf70 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
1bf80 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
1bf90 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
1bfa0 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
1bfb0 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
1bfc0 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
1bfd0 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
1bfe0 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
1bff0 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
1c000 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
1c010 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
1c020 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
1c030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
1c040 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
1c050 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
1c060 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
1c070 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
1c080 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
1c090 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
1c0a0 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
1c0b0 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
1c0c0 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
1c0d0 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
1c0e0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
1c0f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1c100 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
1c110 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
1c120 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
1c130 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1c140 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
1c150 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
1c160 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1c170 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
1c180 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
1c190 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1c1a0 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
1c1b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1c1c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
1c1d0 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
1c1e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1c1f0 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
1c200 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
1c210 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1c220 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
1c230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1c240 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
1c250 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
1c260 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1c270 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1c280 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
1c290 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1c2a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1c2b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1c2c0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1c2d0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1c2e0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1c2f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1c300 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1c310 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1c320 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1c330 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c340 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1c350 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
1c360 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1c370 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1c380 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1c390 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1c3a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c3b0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1c3c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c3d0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1c3e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1c3f0 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
1c400 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1c410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c420 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1c430 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1c440 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1c450 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1c460 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1c470 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1c480 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1c490 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1c4a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c4b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c4c0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1c4d0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1c4e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1c4f0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1c500 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c510 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1c520 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1c530 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c540 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1c550 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1c560 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1c570 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1c580 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1c590 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1c5a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1c5b0 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
1c5c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c5d0 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
1c5e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1c5f0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
1c600 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
1c610 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c620 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
1c630 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c640 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
1c650 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1c660 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1c670 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1c680 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c690 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1c6a0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1c6b0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1c6c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c6d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1c6e0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1c6f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1c700 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1c710 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1c720 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1c740 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1c750 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
1c760 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1c770 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1c780 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1c790 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1c7a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c7b0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1c7c0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1c7d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c7e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1c7f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c800 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1c810 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1c820 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1c830 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1c840 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1c850 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1c860 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1c870 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1c880 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1c890 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1c8a0 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
1c8b0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1c8c0 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
1c8d0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1c8e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1c8f0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1c900 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1c910 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1c920 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1c930 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1c940 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1c950 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1c960 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1c970 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c990 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1c9a0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1c9b0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1c9c0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1c9d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c9e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1c9f0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
1ca00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ca10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ca20 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ca30 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1ca40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ca50 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
1ca60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ca70 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1ca80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ca90 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1caa0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1cab0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1cac0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1cad0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1cae0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1caf0 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  dest, 0, jumpIfN
1cb00 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1cb10 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1cb20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1cb30 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
1cb40 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
1cb50 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
1cb60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1cb70 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1cb80 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
1cb90 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
1cba0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
1cbb0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1cbc0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1cbd0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1cbe0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1cbf0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1cc00 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
1cc10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cc20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1cc30 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
1cc40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1cc50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1cc60 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1cc70 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
1cc80 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1cc90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1cca0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1ccb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ccc0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
1ccd0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
1cce0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
1ccf0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1cd00 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1cd10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1cd20 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1cd30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1cd40 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1cd50 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1cd60 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1cd70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1cd80 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1cd90 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
1cda0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
1cdb0 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
1cdc0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
1cdd0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
1cde0 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
1cdf0 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
1ce00 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
1ce10 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
1ce20 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
1ce30 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
1ce40 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
1ce50 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
1ce60 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
1ce70 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
1ce80 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
1ce90 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
1cea0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  rator..**.** Som
1ceb0 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
1cec0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1ced0 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
1cee0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
1cef0 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
1cf00 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
1cf10 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
1cf20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1cf30 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
1cf40 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
1cf50 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
1cf60 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
1cf70 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
1cf80 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
1cf90 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
1cfa0 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
1cfb0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1cfc0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1cfd0 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
1cfe0 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
1cff0 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
1d000 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
1d010 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
1d020 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
1d030 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
1d040 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d050 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
1d060 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
1d070 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
1d080 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
1d090 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
1d0a0 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
1d0b0 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
1d0c0 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
1d0d0 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
1d0e0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
1d0f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1d100 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1d110 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
1d120 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41 3d 3d  *pB){.  if( pA==
1d130 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
1d140 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
1d150 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 2;.  }.  ass
1d160 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1d170 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1d180 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1d190 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72  uced) );.  asser
1d1a0 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1d1b0 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f  operty(pB, EP_To
1d1c0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1d1d0 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70  ed) );.  if( Exp
1d1e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
1d1f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c   EP_xIsSelect) |
1d200 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
1d210 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pB, EP_xIsSele
1d220 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
1d230 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 2;.  }.  if( (
1d240 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
1d250 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
1d260 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
1d270 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
1d280 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
1d290 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 32 3b  ->op ) return 2;
1d2a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1d2b0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1d2c0 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
1d2d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1d2e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1d2f0 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
1d300 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
1d310 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1d320 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1d330 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
1d340 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 29 20  t, pB->x.pList) 
1d350 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1d360 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
1d370 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
1d380 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
1d390 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
1d3a0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1d3b0 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49 6e  operty(pA, EP_In
1d3c0 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 69  tValue) ){.    i
1d3d0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1d3e0 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61  rty(pB, EP_IntVa
1d3f0 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56  lue) || pA->u.iV
1d400 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue!=pB->u.iVal
1d410 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
1d420 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 2;.    }.  }e
1d430 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  lse if( pA->op!=
1d440 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
1d450 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
1d460 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1d470 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56  erty(pB, EP_IntV
1d480 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28 70  alue) || NEVER(p
1d490 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20  B->u.zToken==0) 
1d4a0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
1d4b0 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
1d4c0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
1d4d0 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
1d4e0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
1d4f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  }.  }.  if( (pA-
1d500 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1d510 6f 6c 6c 61 74 65 29 21 3d 28 70 42 2d 3e 66 6c  ollate)!=(pB->fl
1d520 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1d530 61 74 65 29 20 29 20 72 65 74 75 72 6e 20 31 3b  ate) ) return 1;
1d540 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
1d550 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
1d560 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 70 43 6f  e)!=0 && pA->pCo
1d570 6c 6c 21 3d 70 42 2d 3e 70 43 6f 6c 6c 20 29 20  ll!=pB->pColl ) 
1d580 72 65 74 75 72 6e 20 32 3b 0a 20 20 72 65 74 75  return 2;.  retu
1d590 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
1d5a0 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
1d5b0 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
1d5c0 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
1d5d0 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
1d5e0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
1d5f0 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
1d600 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  any way..**.** T
1d610 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
1d620 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
1d630 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  o for equivalent
1d640 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65   ExprLists.  The
1d650 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75  .** only consequ
1d660 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73  ence will be dis
1d670 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  abled optimizati
1d680 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72  ons.  But this r
1d690 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e  outine.** must n
1d6a0 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66  ever return 0 if
1d6b0 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73   the two ExprLis
1d6c0 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69  t objects are di
1d6d0 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61  fferent, or.** a
1d6e0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c   malfunction wil
1d6f0 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  l result..**.** 
1d700 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  Two NULL pointer
1d710 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1d720 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e   to be the same.
1d730 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69    But a NULL poi
1d740 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64  nter.** always d
1d750 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f  iffers from a no
1d760 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  n-NULL pointer..
1d770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1d780 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78  prListCompare(Ex
1d790 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72  prList *pA, Expr
1d7a0 4c 69 73 74 20 2a 70 42 29 7b 0a 20 20 69 6e 74  List *pB){.  int
1d7b0 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
1d7c0 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
1d7d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
1d7e0 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
1d7f0 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
1d800 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
1d810 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
1d820 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
1d830 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
1d840 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
1d850 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1d860 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
1d870 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
1d880 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
1d890 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
1d8a0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
1d8b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
1d8c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1d8d0 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
1d8e0 45 78 70 72 42 29 20 29 20 72 65 74 75 72 6e 20  ExprB) ) return 
1d8f0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1d900 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
1d910 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1d920 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
1d930 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
1d940 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1d950 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
1d960 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
1d970 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
1d980 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
1d990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d9a0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
1d9b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
1d9c0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
1d9d0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
1d9e0 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
1d9f0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1da00 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
1da10 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
1da20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
1da30 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
1da40 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
1da50 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
1da60 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
1da70 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  umnAlloc,.      
1da80 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
1da90 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
1daa0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
1dab0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
1dac0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
1dad0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
1dae0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1daf0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
1db00 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1db10 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
1db20 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1db30 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
1db40 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
1db50 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
1db60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
1db70 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
1db80 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1db90 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
1dba0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
1dbb0 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
1dbc0 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
1dbd0 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20  ]),.       3,.  
1dbe0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
1dbf0 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  nc,.       &pInf
1dc00 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20  o->nFuncAlloc,. 
1dc10 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1dc20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
1dc30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
1dc40 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
1dc50 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
1dc60 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
1dc70 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
1dc80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1dc90 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
1dca0 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
1dcb0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1dcc0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
1dcd0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1dce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1dcf0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
1dd00 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1dd10 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1dd20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
1dd30 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
1dd40 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
1dd50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1dd60 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
1dd70 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
1dd80 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
1dd90 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
1dda0 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
1ddb0 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
1ddc0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1ddd0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1dde0 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
1ddf0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1de00 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1de10 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
1de20 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
1de30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1de40 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1de50 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
1de60 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
1de70 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
1de80 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
1de90 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
1dea0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
1deb0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
1dec0 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
1ded0 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
1dee0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
1def0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1df00 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
1df10 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
1df20 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
1df30 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1df40 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
1df50 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1df60 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
1df70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1df80 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1df90 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
1dfa0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
1dfb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1dfc0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
1dfd0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
1dfe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
1dff0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1e000 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
1e010 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
1e020 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
1e030 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1e040 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
1e050 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1e060 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
1e070 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1e080 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
1e090 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
1e0a0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
1e0b0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
1e0c0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
1e0d0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
1e0e0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
1e0f0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
1e100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e110 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
1e120 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
1e130 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
1e140 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
1e150 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
1e160 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
1e170 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
1e180 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
1e190 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
1e1a0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
1e1b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1e1c0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
1e1d0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1e1e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1e1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e200 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1e210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e220 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
1e230 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
1e240 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
1e250 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
1e260 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
1e270 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
1e280 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1e290 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
1e2a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1e2c0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
1e2d0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
1e2e0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
1e2f0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
1e300 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
1e310 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
1e320 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
1e330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e340 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
1e350 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1e360 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1e370 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
1e380 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
1e390 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
1e3a0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
1e3b0 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
1e3c0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
1e3f0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
1e400 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
1e410 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1e430 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1e440 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
1e450 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
1e460 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
1e470 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1e480 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1e490 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
1e4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e4b0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
1e4c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1e4e0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
1e4f0 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
1e500 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
1e510 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1e520 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
1e530 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
1e540 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1e560 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1e570 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
1e580 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1e590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e5a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e5d0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
1e5e0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
1e5f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e600 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1e610 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
1e620 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
1e630 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1e640 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e650 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
1e660 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
1e670 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
1e680 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
1e690 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
1e6a0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
1e6b0 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
1e6c0 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
1e6d0 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
1e6e0 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
1e6f0 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
1e700 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
1e710 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
1e720 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
1e730 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e740 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1e750 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
1e760 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1e770 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
1e780 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
1e790 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e7a0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
1e7b0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
1e7c0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
1e7d0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
1e7e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1e7f0 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
1e800 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1e810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
1e820 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
1e830 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
1e840 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
1e850 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
1e860 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
1e870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e880 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1e890 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e8a0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
1e8b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
1e8c0 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
1e8d0 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
1e8e0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
1e8f0 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
1e900 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
1e910 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
1e920 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
1e930 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1e940 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
1e950 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
1e960 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
1e970 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
1e980 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
1e990 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
1e9a0 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
1e9b0 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
1e9c0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1e9d0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
1e9e0 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
1e9f0 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
1ea00 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1ea10 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1ea20 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1ea30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1ea40 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
1ea50 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 3d 3d  >pExpr, pExpr)==
1ea60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1ea70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ea80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1ea90 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
1eaa0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
1eab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
1eac0 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
1ead0 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
1eae0 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
1eaf0 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
1eb00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
1eb10 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
1eb20 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
1eb30 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
1eb40 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
1eb50 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
1eb60 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
1eb70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
1eb80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1eb90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1eba0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1ebc0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
1ebd0 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
1ebe0 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
1ebf0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
1ec00 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
1ec10 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1ec20 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
1ec30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ec40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ec50 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1ec70 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
1ec80 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
1ec90 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1ecb0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73  xpr->u.zToken, s
1ecc0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
1ecd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c  Expr->u.zToken),
1ece0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ecf0 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
1ed00 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
1ed10 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
1ed20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
1ed30 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1ed40 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1ed50 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
1ed60 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
1ed70 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
1ed80 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
1ed90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eda0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1edb0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1edd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ede0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
1edf0 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
1ee00 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
1ee10 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
1ee20 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
1ee30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
1ee40 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1ee50 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
1ee60 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1ee70 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
1ee80 20 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65       ExprSetIrre
1ee90 64 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a  ducible(pExpr);.
1eea0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1eeb0 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
1eec0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
1eed0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
1eee0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1eef0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
1ef00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1ef10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1ef20 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
1ef30 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
1ef40 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b  tesInSelect(Walk
1ef50 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1ef60 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
1ef70 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
1ef80 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
1ef90 4e 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e  NC;.  if( pNC->n
1efa0 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Depth==0 ){.    
1efb0 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20  pNC->nDepth++;. 
1efc0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1efd0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
1efe0 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 43 2d  elect);.    pNC-
1eff0 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20 72  >nDepth--;.    r
1f000 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1f010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1f020 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1f030 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
1f040 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65  Analyze the give
1f050 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  n expression loo
1f060 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
1f070 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
1f080 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
1f090 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1f0a0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
1f0b0 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1f0c0 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64  ray..** Make add
1f0d0 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
1f0e0 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1f0f0 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  Agg[] array as n
1f100 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
1f110 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
1f120 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
1f130 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
1f140 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
1f150 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
1f160 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
1f170 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
1f180 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
1f190 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1f1a0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
1f1b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1f1c0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1f1d0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1f1e0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1f1f0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
1f200 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
1f210 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
1f220 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  t;.  w.u.pNC = p
1f230 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
1f240 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
1f250 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
1f260 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
1f270 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
1f280 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1f290 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
1f2a0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1f2b0 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
1f2c0 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
1f2d0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1f2e0 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
1f2f0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
1f300 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
1f310 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
1f320 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f330 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1f340 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
1f350 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
1f360 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
1f370 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1f380 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1f390 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
1f3a0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
1f3b0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
1f3c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
1f3d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1f3e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1f3f0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
1f400 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1f410 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1f420 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
1f430 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
1f440 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
1f450 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
1f460 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
1f470 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
1f480 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
1f490 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
1f4a0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
1f4b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
1f4c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1f4d0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
1f4e0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
1f4f0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
1f500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
1f510 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
1f520 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
1f530 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
1f540 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
1f550 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
1f560 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
1f570 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
1f580 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
1f590 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
1f5a0 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20  the dallocation 
1f5b0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
1f5c0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
1f5d0 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
1f5e0 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
1f5f0 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
1f600 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f610 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
1f620 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1f630 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
1f640 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
1f650 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1f660 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1f670 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
1f680 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
1f690 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
1f6a0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1f6b0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1f6c0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1f6d0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1f6e0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
1f6f0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
1f700 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
1f710 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
1f720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f730 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1f740 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1f750 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
1f760 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
1f770 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
1f780 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
1f790 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
1f7a0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
1f7b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1f7c0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1f7d0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
1f7e0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
1f7f0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
1f800 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
1f810 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
1f820 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
1f830 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
1f840 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
1f850 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
1f860 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
1f870 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
1f880 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
1f890 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
1f8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
1f8b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1f8c0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1f8d0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
1f8e0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
1f8f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1f900 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
1f910 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1f920 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
1f930 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1f940 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
1f950 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
1f960 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
1f970 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
1f980 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
1f990 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
1f9a0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
1f9b0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
1f9c0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
1f9d0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1f9e0 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
1f9f0 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
1fa00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fa10 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
1fa20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1fa30 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
1fa40 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
1fa50 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
1fa60 30 3b 0a 7d 0a                                   0;.}.