/ Hex Artifact Content
Login

Artifact 3d800a2280d1ea4eab33ab500af59ebb7b878e64:


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 2c 20    Select *pNew, 
7950: 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70  *pPrior;.  if( p
7960: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7970: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
7980: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
7990: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
79a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
79b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
79c0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
79d0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
79e0: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
79f0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  );.  pNew->pSrc 
7a00: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
7a10: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c  Dup(db, p->pSrc,
7a20: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7a30: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
7a40: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7a50: 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a  pWhere, flags);.
7a60: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
7a70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7a80: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
7a90: 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  oupBy, flags);. 
7aa0: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
7ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7ac0: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
7ad0: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7ae0: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
7af0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7b00: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66  , p->pOrderBy, f
7b10: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  lags);.  pNew->o
7b20: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
7b30: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
7b40: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
7b50: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72  ctDup(db, p->pPr
7b60: 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  ior, flags);.  i
7b70: 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
7b80: 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
7b90: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
7ba0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
7bb0: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
7bc0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
7bd0: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  it, flags);.  pN
7be0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
7bf0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7c00: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61   p->pOffset, fla
7c10: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  gs);.  pNew->iLi
7c20: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
7c30: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
7c40: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
7c50: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
7c60: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
7c70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
7c80: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
7c90: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
7ca0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
7cb0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
7cc0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
7cd0: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
7ce0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
7cf0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
7d00: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
7d10: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7d20: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
7d30: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
7d40: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
7d50: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
7d60: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
7d70: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
7d80: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
7d90: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
7da0: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
7db0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
7dc0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
7dd0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
7de0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
7df0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7e00: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
7e10: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
7e20: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
7e30: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
7e40: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
7e50: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
7e60: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
7e70: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
7e80: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
7e90: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
7ea0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7eb0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
7ec0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
7ee0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
7ef0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
7f00: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
7f10: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
7f20: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
7f30: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
7f40: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
7f50: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
7f60: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
7f70: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
7f80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7f90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7fa0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
7fb0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
7fc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7fd0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
7fe0: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
7ff0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
8000: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8010: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
8020: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
8030: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
8040: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
8050: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
8060: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8070: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
8080: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
8090: 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20  Alloc*2 + 4;.   
80a0: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
80b0: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d  alloc(db, pList-
80c0: 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69  >a, n*sizeof(pLi
80d0: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
80e0: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
80f0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
8100: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
8110: 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74  a = a;.    pList
8120: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  ->nAlloc = sqlit
8130: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
8140: 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61 5b 30  b, a)/sizeof(a[0
8150: 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ]);.  }.  assert
8160: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
8170: 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20  .  if( 1 ){.    
8180: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8190: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
81a0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
81b0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
81c0: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
81d0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
81e0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
81f0: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
8200: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
8210: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
8220: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
8230: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
8240: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
8250: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8260: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
8270: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8280: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
8290: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
82a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
82b0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  xprList.a[].zNam
82c0: 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  e element of the
82d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
82e0: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
82f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
8300: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
8310: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
8320: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
8330: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d  error.  But pNam
8340: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
8350: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
8360: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8370: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
8380: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8390: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
83a0: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
83b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
83c0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
83d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
83e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
83f0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
8400: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
8410: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
8420: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
8430: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
8440: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8450: 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64  /* Name to be ad
8460: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ded */.  int deq
8470: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
8480: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73   /* True to caus
8490: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65  e the name to be
84a0: 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a   dequoted */.){.
84b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
84c0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
84d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
84e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
84f0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8500: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8510: 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
8520: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
8530: 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
8540: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
8550: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
8560: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
8570: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  me==0 );.    pIt
8580: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
8590: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61  te3DbStrNDup(pPa
85a0: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e  rse->db, pName->
85b0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
85c0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
85d0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20   pItem->zName ) 
85e0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
85f0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8600: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
8610: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8620: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
8630: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8640: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8650: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8660: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8670: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8680: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8690: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
86a0: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
86b0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
86c0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
86d0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
86e0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
86f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8700: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8710: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8720: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
8730: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8740: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8750: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8760: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8770: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8780: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8790: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72   span. */.  Expr
87a0: 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20  Span *pSpan     
87b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20      /* The span 
87c0: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29  to be added */.)
87d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
87e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
87f0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
8800: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
8810: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
8820: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
8830: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8840: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
8850: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
8860: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
8870: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
8880: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8890: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
88a0: 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70  d || pItem->pExp
88b0: 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20  r==pSpan->pExpr 
88c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
88d0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
88e0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
88f0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
8900: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
8910: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
8920: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
8950: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
8960: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
8970: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
8980: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
8990: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
89a0: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
89b0: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
89c0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
89d0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
89e0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
89f0: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
8a00: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
8a10: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
8a20: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
8a30: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
8a40: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
8a50: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
8a60: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8a70: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
8a80: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
8a90: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
8aa0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
8ab0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
8ac0: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
8ad0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
8ae0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
8af0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
8b00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8b10: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
8b20: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
8b30: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
8b40: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
8b50: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
8b60: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
8b70: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8b80: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
8b90: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
8ba0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
8bb0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8bc0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
8bd0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
8be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
8bf0: 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73  t->a!=0 || (pLis
8c00: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70  t->nExpr==0 && p
8c10: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29  List->nAlloc==0)
8c20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
8c30: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73  ist->nExpr<=pLis
8c40: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66  t->nAlloc );.  f
8c50: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
8c60: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
8c70: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
8c80: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
8c90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8ca0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
8cb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8cc0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
8cd0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
8ce0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
8cf0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
8d00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8d10: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
8d20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8d30: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
8d40: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
8d50: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
8d60: 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75  backs.  Walker.u
8d70: 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72  .pi is a pointer
8d80: 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  .** to an intege
8d90: 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  r.  These routin
8da0: 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20  es are checking 
8db0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
8dc0: 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73   see.** if it is
8dd0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65   a constant.  Se
8de0: 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74  t *Walker.u.pi t
8df0: 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65  o 0 if the expre
8e00: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20  ssion is.** not 
8e10: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
8e20: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
8e30: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
8e40: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
8e50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
8e60: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
8e70: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a  prIsConstant().*
8e80: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
8e90: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
8ea0: 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  in().**     sqli
8eb0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8ec0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a  tOrFunction().**
8ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
8ee0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
8ef0: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
8f00: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
8f10: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
8f20: 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e  r->u.i is 3 then
8f30: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
8f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
8f50: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
8f60: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
8f70: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
8f80: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
8f90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
8fa0: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
8fb0: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
8fc0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
8fd0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20  lker->u.i==3 && 
8fe0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
8ff0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
9000: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
9010: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
9020: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
9030: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
9040: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
9050: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
9060: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
9070: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
9080: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
9090: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
90a0: 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65     ** and pWalke
90b0: 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20  r->u.i==2 */.   
90c0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
90d0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
90e0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72  lker->u.i==2 ) r
90f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f  eturn 0;.      /
9100: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
9110: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
9120: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
9130: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
9140: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
9150: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
9160: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
9170: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
9180: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
9190: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
91a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
91b0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
91c0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
91d0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
91e0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
91f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9200: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
9210: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
9220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
9230: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
9240: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
9250: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
9260: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
9270: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
9280: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
9290: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
92a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
92b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
92c0: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
92d0: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
92e0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
92f0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
9300: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
9310: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
9320: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
9330: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
9340: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
9350: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9360: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
9370: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
9380: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
9390: 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bort;.}.static i
93a0: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
93b0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
93c0: 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Flag){.  Walker 
93d0: 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69  w;.  w.u.i = ini
93e0: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
93f0: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
9400: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
9410: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
9420: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
9430: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
9440: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
9450: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
9460: 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  u.i;.}../*.** Wa
9470: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
9480: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
9490: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
94a0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
94b0: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
94c0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
94d0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
94e0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
94f0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
9500: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
9510: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
9520: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
9530: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
9540: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
9550: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
9560: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
9570: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
9580: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
9590: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
95a0: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  t(Expr *p){.  re
95b0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
95c0: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
95d0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
95e0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
95f0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
9600: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
9610: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
9620: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
9630: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
9640: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
9650: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
9660: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
9670: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
9680: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
9690: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
96a0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
96b0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
96c0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
96d0: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
96e0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
96f0: 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a  Const(p, 3);.}..
9700: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
9710: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
9720: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
9730: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
9740: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
9750: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
9760: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
9770: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
9780: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
9790: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
97a0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
97b0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
97c0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
97d0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
97e0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
97f0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
9800: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
9810: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
9820: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
9830: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
9840: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
9850: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9860: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
9870: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
9880: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b  prIsConst(p, 2);
9890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
98a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
98b0: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
98c0: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
98d0: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
98e0: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
98f0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
9900: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
9910: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
9920: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
9930: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
9940: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
9950: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
9960: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
9970: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
9980: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
9990: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
99a0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
99b0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
99c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
99d0: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
99e0: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
99f0: 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  t rc = 0;..  /* 
9a00: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
9a10: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
9a20: 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
9a30: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
9a40: 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
9a50: 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
9a60: 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
9a70: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
9a80: 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
9a90: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
9aa0: 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
9ab0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
9ac0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
9ad0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
9ae0: 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
9af0: 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
9b00: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
9b10: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
9b20: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
9b30: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
9b40: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
9b50: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
9b60: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
9b70: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9b80: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
9b90: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
9ba0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
9bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9bc0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
9bd0: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
9be0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
9bf0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
9c00: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
9c10: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
9c20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
9c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
9c50: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
9c60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9c80: 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
9c90: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
9ca0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9cb0: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
9cc0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9cd0: 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
9ce0: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
9cf0: 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
9d00: 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
9d10: 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
9d20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9d30: 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
9d40: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
9d50: 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
9d60: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
9d70: 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
9d80: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
9d90: 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
9da0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
9db0: 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
9dc0: 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
9dd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
9de0: 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
9df0: 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
9e00: 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
9e10: 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
9e20: 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
9e30: 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
9e40: 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
9e50: 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
9e60: 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
9e70: 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
9e80: 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
9e90: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
9ea0: 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
9eb0: 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
9ec0: 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
9ed0: 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
9ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
9ef0: 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
9f00: 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
9f10: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
9f20: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
9f30: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
9f40: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
9f50: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
9f60: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
9f70: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
9f80: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
9f90: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
9fa0: 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
9fb0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
9fc0: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
9fd0: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
9fe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9ff0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
a010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a020: 74 65 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20  te an OP_IsNull 
a030: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
a040: 20 74 65 73 74 73 20 72 65 67 69 73 74 65 72 20   tests register 
a050: 69 52 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a 2a  iReg and jumps.*
a060: 2a 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 44  * to location iD
a070: 65 73 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  est if the value
a080: 20 69 6e 20 69 52 65 67 20 69 73 20 4e 55 4c 4c   in iReg is NULL
a090: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  .  The value in 
a0a0: 69 52 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f 6d  iReg .** was com
a0b0: 70 75 74 65 64 20 62 79 20 70 45 78 70 72 2e 20  puted by pExpr. 
a0c0: 20 49 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20   If we can look 
a0d0: 61 74 20 70 45 78 70 72 20 61 74 20 63 6f 6d 70  at pExpr at comp
a0e0: 69 6c 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a 20  ile-time and.** 
a0f0: 64 65 74 65 72 6d 69 6e 65 20 74 68 61 74 20 69  determine that i
a100: 74 20 63 61 6e 20 6e 65 76 65 72 20 67 65 6e 65  t can never gene
a110: 72 61 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68 65  rate a NULL, the
a120: 6e 20 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c 20  n the OP_IsNull 
a130: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
a140: 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a   be omitted..*/.
a150: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
a160: 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a  CodeIsNullJump(.
a170: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
a180: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
a190: 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
a1a0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
a1b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 2f 2a  Expr *pExpr,  /*
a1c0: 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 4f   Only generate O
a1d0: 50 5f 49 73 4e 75 6c 6c 20 69 66 20 74 68 69 73  P_IsNull if this
a1e0: 20 65 78 70 72 20 63 61 6e 20 62 65 20 4e 55 4c   expr can be NUL
a1f0: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  L */.  int iReg,
a200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
a210: 73 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  st the value in 
a220: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 66 6f  this register fo
a230: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
a240: 69 44 65 73 74 20 20 20 20 20 20 20 20 20 20 20  iDest           
a250: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
a260: 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6c  the value is nul
a270: 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73 71  l */.){.  if( sq
a280: 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
a290: 6c 6c 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ll(pExpr) ){.   
a2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2b0: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
a2c0: 20 69 52 65 67 2c 20 69 44 65 73 74 29 3b 0a 20   iReg, iDest);. 
a2d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
a2e0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
a2f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
a300: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
a310: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
a320: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
a330: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
a340: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
a350: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
a360: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
a370: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a380: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
a390: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
a3a0: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
a3b0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
a3c0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
a3d0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
a3e0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
a3f0: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
a400: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
a410: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
a420: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
a430: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
a440: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a450: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
a460: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
a470: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
a480: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
a490: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
a4a0: 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  FF_NONE ) return
a4b0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
a4c0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
a4d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
a4e0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
a4f0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
a500: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
a510: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
a520: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
a530: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
a540: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
a550: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
a560: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
a570: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
a580: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
a590: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a5a0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
a5b0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
a5c0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
a5d0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a5e0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
a5f0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
a600: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a610: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a620: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
a630: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
a640: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
a650: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a660: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
a670: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
a680: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
a690: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
a6a0: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
a6b0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
a6c0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
a6d0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
a6e0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
a6f0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
a700: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a710: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
a720: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
a730: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
a740: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
a750: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
a760: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
a770: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
a780: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
a790: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
a7a0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
a7b0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
a7c0: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
a7d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a7e0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
a7f0: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
a800: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a810: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
a820: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
a830: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
a840: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
a850: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
a860: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
a870: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
a880: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20  optimization on 
a890: 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  a.** query of th
a8a0: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
a8b0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
a8c0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  ...).**.** Where
a8d0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63   the SELECT... c
a8e0: 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63  lause is as spec
a8f0: 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72  ified by the par
a900: 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a  ameter to this.*
a910: 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  * routine..**.**
a920: 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   The Select obje
a930: 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73  ct passed in has
a940: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
a950: 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e  eprocessed and n
a960: 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65  o.** errors have
a970: 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a   been found..*/.
a980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a990: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
a9a0: 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64  tic int isCandid
a9b0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65  ateForInOpt(Sele
a9c0: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
a9d0: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
a9e0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
a9f0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
aa00: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
aa10: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
aa20: 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61       /* right-ha
aa30: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73  nd side of IN is
aa40: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
aa50: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
aa60: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
aa70: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
aa80: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
aa90: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
aaa0: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
aab0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
aac0: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
aad0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
aae0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
aaf0: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
ab00: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
ab10: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
ab20: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
ab30: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
ab40: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
ab50: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
ab60: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
ab70: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
ab80: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
ab90: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
aba0: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
abb0: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
abc0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
abd0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
abe0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
abf0: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
ac00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
ac10: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
ac20: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
ac30: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac50: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
ac60: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
ac70: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
ac80: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
ac90: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
aca0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
acb0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
acc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
acd0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
ace0: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
acf0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
ad00: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
ad10: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
ad20: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
ad30: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
ad40: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
ad50: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
ad60: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
ad70: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
ad80: 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e  0].pTab;.  if( N
ad90: 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20  EVER(pTab==0) ) 
ada0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
adb0: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
adc0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
add0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
ade0: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
adf0: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
ae00: 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
ae10: 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
ae20: 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
ae30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
ae40: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
ae50: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
ae60: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
ae70: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
ae80: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69   /* One column i
ae90: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
aea0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
aeb0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
aec0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
aed0: 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c  turn 0; /* Resul
aee0: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  t is a column */
aef0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
af00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
af10: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
af20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
af30: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ction is used by
af40: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
af50: 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e  ion of the IN (.
af60: 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ..) operator..**
af70: 20 49 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20   It's job is to 
af80: 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
af90: 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
afa0: 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  e that may be us
afb0: 65 64 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20  ed.** either to 
afc0: 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
afd0: 68 69 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29  hip of the (...)
afe0: 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61   set or to itera
aff0: 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74  te through.** it
b000: 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70  s members, skipp
b010: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
b020: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
b030: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 6f 70  of the cursor op
b040: 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
b050: 65 65 20 28 64 61 74 61 62 61 73 65 20 74 61 62  ee (database tab
b060: 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64  le, database ind
b070: 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d  ex .** or epherm
b080: 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f  al table) is sto
b090: 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c  red in pX->iTabl
b0a0: 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
b0b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
b0c0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
b0d0: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
b0e0: 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
b0f0: 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65   the b-tree type
b100: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
b110: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
b120: 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f  OWID - The curso
b130: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
b140: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
b150: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
b160: 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73  INDEX - The curs
b170: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
b180: 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65   a database inde
b190: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
b1a0: 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72  _EPH -   The cur
b1b0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
b1c0: 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
b1d0: 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
b200: 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  mal table..**.**
b210: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74   An existing b-t
b220: 72 65 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ree may only be 
b230: 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c 45  used if the SELE
b240: 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d  CT is of the sim
b250: 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a  ple.** form:.**.
b260: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
b270: 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62  olumn> FROM <tab
b280: 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
b290: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
b2a0: 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
b2b0: 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
b2c0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
b2d0: 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
b2e0: 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20  he set members, 
b2f0: 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70  skipping any dup
b300: 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73  licates. In this
b310: 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65   case an.** ephe
b320: 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
b330: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
b340: 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f  the selected <co
b350: 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74  lumn> is guarant
b360: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
b370: 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
b380: 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
b390: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b3a0: 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61  Y or it.** has a
b3b0: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
b3c0: 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  nt or UNIQUE ind
b3d0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ex..**.** If the
b3e0: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
b3f0: 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
b400: 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
b410: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
b420: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
b430: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e 20  mbership tests. 
b440: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 20  In this case an 
b450: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
b460: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
b470: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
b480: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
b490: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
b4a0: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
b4b0: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
b4c0: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
b4d0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
b4e0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
b4f0: 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
b500: 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
b510: 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
b520: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
b530: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
b540: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b550: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
b560: 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ains an SQL NULL
b570: 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72   .** value in or
b580: 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79  der to correctly
b590: 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
b5a0: 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e  sions like "X IN
b5b0: 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20   (Y, Z)"..** If 
b5c0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
b5d0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
b5e0: 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
b5f0: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
b600: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
b610: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
b620: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
b630: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
b640: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
b650: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20  *prNotFound. If 
b660: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
b670: 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
b680: 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
b690: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
b6a0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20   *prNotFound is 
b6b0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
b6c0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
b6d0: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
b6e0: 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
b6f0: 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e  n stored in *prN
b700: 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a  otFound, then.**
b710: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c   its initial val
b720: 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  ue is NULL.  If 
b730: 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20 6e  the (...) does n
b740: 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61  ot remain consta
b750: 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75  nt.** for the du
b760: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75  ration of the qu
b770: 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45  ery (i.e. the SE
b780: 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68 65 20  LECT within the 
b790: 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63 6f  (...).** is a co
b7a0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
b7b0: 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  y) then the valu
b7c0: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
b7d0: 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ed register is.*
b7e0: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
b7f0: 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 73 75  each time the su
b800: 62 71 75 65 72 79 20 69 73 20 72 65 72 75 6e 2e  bquery is rerun.
b810: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
b820: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75 73  .** caller to us
b830: 65 20 76 64 62 65 20 63 6f 64 65 20 65 71 75 69  e vdbe code equi
b840: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f  valent to the fo
b850: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
b860: 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e   if( register==N
b870: 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61  ULL ){.**     ha
b880: 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69  s_null = <test i
b890: 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  f data structure
b8a0: 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a   contains null>.
b8b0: 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72 20  **     register 
b8c0: 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  = 1.**   }.**.**
b8d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
b8e0: 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c  id running the <
b8f0: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
b900: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
b910: 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f  null>.** test mo
b920: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73  re often than is
b930: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23   necessary..*/.#
b940: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b950: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
b960: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
b970: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
b980: 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20  , Expr *pX, int 
b990: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20  *prNotFound){.  
b9a0: 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
b9d0: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
b9e0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
b9f0: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
ba20: 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
ba30: 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
ba40: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
ba50: 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
ba60: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
ba70: 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
ba80: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
ba90: 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e  que = (prNotFoun
baa0: 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75 65  d==0);   /* True
bab0: 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
bac0: 75 6e 69 71 75 65 20 2a 2f 0a 0a 20 20 61 73 73  unique */..  ass
bad0: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
bae0: 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  IN );..  /* Chec
baf0: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
bb00: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
bb10: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
bb20: 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
bb30: 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
bb40: 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
bb50: 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
bb60: 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
bb70: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  meral table..  *
bb80: 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73  /.  p = (ExprHas
bb90: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
bba0: 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d  xIsSelect) ? pX-
bbb0: 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b  >x.pSelect : 0);
bbc0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
bbd0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26  arse->nErr==0) &
bbe0: 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  & isCandidateFor
bbf0: 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20  InOpt(p) ){.    
bc00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
bc10: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
bc20: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
bc30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
bc40: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
bc50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
bc60: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
bc70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
bc80: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
bc90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
bcc0: 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
bcd0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
bd00: 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  ession <column> 
bd10: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  */.    int iCol;
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 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
bd50: 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20   <column> */.   
bd60: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
bd90: 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
bda0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
bdb0: 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20 20   p );           
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bdd0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
bde0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
bdf0: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
be00: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be20: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
be30: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
be40: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
be50: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
be60: 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
be70: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
be80: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
be90: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
bea0: 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bec0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
bed0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
bee0: 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
bef0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
bf00: 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20  ab;.    pExpr = 
bf10: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
bf20: 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20  pExpr;.    iCol 
bf30: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
bf40: 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64  ;.   .    /* Cod
bf50: 65 20 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f  e an OP_VerifyCo
bf60: 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c  okie and OP_Tabl
bf70: 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
bf80: 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
bf90: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
bfa0: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
bfb0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
bfc0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
bfd0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
bfe0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
bff0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
c000: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
c010: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
c020: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
c030: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
c040: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
c050: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
c060: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
c070: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
c080: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
c090: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
c0a0: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
c0b0: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
c0c0: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
c0d0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
c0e0: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
c0f0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
c100: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
c110: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
c120: 74 20 69 41 64 64 72 3b 0a 0a 20 20 20 20 20 20  t iAddr;..      
c130: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
c140: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c150: 4f 6e 63 65 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20  Once, iMem);..  
c160: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
c170: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
c180: 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
c190: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
c1a0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
c1b0: 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
c1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c1d0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
c1e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c1f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
c220: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20  r variable */.. 
c230: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
c240: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
c250: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
c260: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
c270: 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
c280: 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
c290: 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
c2a0: 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
c2b0: 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
c2c0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
c2d0: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
c2e0: 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ence.  */.      
c2f0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20  CollSeq *pReq = 
c300: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
c310: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
c320: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
c330: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Expr);..      /*
c340: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
c350: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
c360: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
c370: 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20  rform the .     
c380: 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
c390: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
c3a0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
c3b0: 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20  e column. If.   
c3c0: 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c     ** it is not,
c3d0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
c3e0: 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69  ble to use any i
c3f0: 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndex..      */. 
c400: 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d 20       char aff = 
c410: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
c420: 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e  ty(pX);.      in
c430: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
c440: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  (pTab->aCol[iCol
c450: 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c  ].affinity==aff|
c460: 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  |aff==SQLITE_AFF
c470: 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66  _NONE);..      f
c480: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
c490: 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54  ndex; pIdx && eT
c4a0: 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69  ype==0 && affini
c4b0: 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78  ty_ok; pIdx=pIdx
c4c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
c4d0: 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43    if( (pIdx->aiC
c4e0: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a  olumn[0]==iCol).
c4f0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
c500: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
c510: 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78  b, ENC(db), pIdx
c520: 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d  ->azColl[0], 0)=
c530: 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26  =pReq.         &
c540: 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65  & (!mustBeUnique
c550: 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   || (pIdx->nColu
c560: 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f  mn==1 && pIdx->o
c570: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29  nError!=OE_None)
c580: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
c590: 20 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20         int iMem 
c5a0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
c5b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
c5c0: 69 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20  iAddr;.         
c5d0: 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a   char *pKey;.  .
c5e0: 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d            pKey =
c5f0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
c600: 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
c610: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
c620: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
c630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c640: 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 69 4d 65 6d  v, OP_Once, iMem
c650: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
c660: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c670: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
c680: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
c690: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
c6c0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
c6d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
c6e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
c6f0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
c700: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
c710: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
c720: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
c730: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c740: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
c750: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
c760: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
c770: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
c780: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
c790: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
c7a0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
c7b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c7d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
c7e0: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
c7f0: 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e  * Could not foun
c800: 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
c810: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
c820: 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
c830: 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
c840: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
c850: 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
c860: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
c870: 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
c880: 20 20 20 20 64 6f 75 62 6c 65 20 73 61 76 65 64      double saved
c890: 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
c8a0: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
c8b0: 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
c8c0: 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
c8d0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
c8e0: 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e  EPH;.    if( prN
c8f0: 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20  otFound ){.     
c900: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72   *prNotFound = r
c910: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
c920: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
c940: 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
c950: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75  >nQueryLoop>(dou
c960: 62 6c 65 29 31 20 29 3b 0a 20 20 20 20 20 20 70  ble)1 );.      p
c970: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
c980: 70 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  p = (double)1;. 
c990: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
c9a0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
c9b0: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
c9c0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
c9d0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
c9e0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
c9f0: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
ca00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
ca10: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
ca20: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
ca30: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
ca40: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
ca50: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
ca60: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
ca70: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
ca80: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
ca90: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
caa0: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
cab0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
cac0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
cad0: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
cae0: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
caf0: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
cb00: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
cb10: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
cb20: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
cb30: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
cb40: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
cb50: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
cb60: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
cb70: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
cb80: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
cb90: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
cba0: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
cbb0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
cbc0: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
cbd0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
cbe0: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
cbf0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
cc00: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
cc10: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
cc20: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
cc30: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
cc40: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
cc50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
cc60: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
cc70: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
cc80: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
cc90: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
cca0: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
ccb0: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
ccc0: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
ccd0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
cce0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
ccf0: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
cd00: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
cd10: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
cd20: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
cd30: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
cd40: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
cd50: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
cd60: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
cd70: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
cd80: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
cd90: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
cda0: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
cdb0: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
cdc0: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
cdd0: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
cde0: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
cdf0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
ce00: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
ce10: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
ce20: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
ce30: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
ce40: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
ce50: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
ce60: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
ce70: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
ce80: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
ce90: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
cea0: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
ceb0: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
cec0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
ced0: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
cee0: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
cef0: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
cf00: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
cf10: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
cf20: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
cf30: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
cf40: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
cf50: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
cf60: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
cf70: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
cf80: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
cf90: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
cfa0: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
cfb0: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
cfc0: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
cfd0: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
cfe0: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
cff0: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
d000: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
d010: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
d020: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
d030: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
d040: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
d050: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
d060: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
d070: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
d080: 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e  resense or absen
d090: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
d0a0: 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f  he RHS..**.** Fo
d0b0: 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
d0c0: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
d0d0: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
d0e0: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
d0f0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
d100: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
d110: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
d120: 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  curs, the return
d130: 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a   value is 0..*/.
d140: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d150: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
d160: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
d170: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
d180: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d190: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d1a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
d1b0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
d1c0: 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
d1d0: 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
d1e0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
d1f0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20  rMayHaveNull,   
d200: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
d210: 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
d220: 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
d230: 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
d240: 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
d250: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
d260: 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
d270: 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
d280: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  /.){.  int testA
d290: 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ddr = -1;       
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d2b0: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
d2c0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
d2d0: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
d300: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
d310: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
d320: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d330: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
d340: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
d350: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
d360: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
d370: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
d380: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
d390: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
d3a0: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
d3b0: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
d3c0: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
d3d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
d3e0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
d3f0: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
d400: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
d410: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
d420: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
d430: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
d440: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
d450: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
d460: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
d470: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
d480: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
d490: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
d4a0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
d4b0: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
d4c0: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
d4d0: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
d4e0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
d4f0: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
d500: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
d510: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
d520: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
d530: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
d540: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d550: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26  EP_VarSelect) &&
d560: 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
d570: 65 72 54 61 62 20 29 7b 0a 20 20 20 20 69 6e 74  erTab ){.    int
d580: 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d   mem = ++pParse-
d590: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 74 65 73 74 41  >nMem;.    testA
d5a0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d5b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
d5c0: 63 65 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 23  ce, mem);.  }..#
d5d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d5e0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28  IT_EXPLAIN.  if(
d5f0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
d600: 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
d610: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
d620: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
d630: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45  pParse->db, "EXE
d640: 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45  CUTE %s%s SUBQUE
d650: 52 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72  RY %d", testAddr
d660: 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
d670: 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
d680: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
d690: 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20  LIST":"SCALAR", 
d6a0: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
d6b0: 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
d6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d6d0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
d6e0: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
d6f0: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
d700: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
d710: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
d720: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
d730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
d740: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66   {.      char af
d750: 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
d760: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
d770: 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
d780: 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 4b  he IN */.      K
d790: 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 20  eyInfo keyInfo; 
d7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
d7b0: 79 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 67 65  yinfo for the ge
d7c0: 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 2a 2f  nerated table */
d7d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
d800: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
d810: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
d820: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
d830: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
d840: 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
d850: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d860: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72   */..      if( r
d870: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
d880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d890: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d8a0: 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65  ull, 0, rMayHave
d8b0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Null);.      }..
d8c0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
d8d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
d8e0: 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20  nity(pLeft);..  
d8f0: 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
d900: 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
d910: 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
d920: 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
d930: 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
d940: 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
d950: 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
d960: 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72  way.  An ephemer
d970: 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
d980: 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
d990: 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69  h single-field i
d9a0: 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73  ndex keys repres
d9b0: 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  enting the resul
d9c0: 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ts.      ** from
d9d0: 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74   the SELECT or t
d9e0: 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
d9f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
da00: 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
da10: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
da20: 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
da30: 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
da40: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
da50: 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
da60: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
da70: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
da80: 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
da90: 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
daa0: 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
dab0: 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
dac0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
dad0: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
dae0: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
daf0: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
db00: 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
db10: 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
db20: 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
db30: 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
db40: 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
db50: 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
db60: 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
db70: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
db80: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
db90: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
dba0: 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
dbb0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dbc0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
dbd0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
dbe0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
dbf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dc00: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
dc10: 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  al, pExpr->iTabl
dc20: 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20  e, !isRowid);.  
dc30: 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65      if( rMayHave
dc40: 4e 75 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65  Null==0 ) sqlite
dc50: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
dc60: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
dc70: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
dc80: 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  &keyInfo, 0, siz
dc90: 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20  eof(keyInfo));. 
dca0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69       keyInfo.nFi
dcb0: 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  eld = 1;..      
dcc0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
dcd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
dce0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
dcf0: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
dd00: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
dd10: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
dd20: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
dd30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
dd40: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
dd50: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
dd60: 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
dd70: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
dd80: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
dd90: 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
dda0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ddb0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
ddc0: 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
ddd0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20  ist *pEList;..  
dde0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
ddf0: 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  sRowid );.      
de00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
de10: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
de20: 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  RT_Set, pExpr->i
de30: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
de40: 64 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20  dest.affinity = 
de50: 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  (u8)affinity;.  
de60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
de70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
de80: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
de90: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
dea0: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
deb0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
dec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ded0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
dee0: 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
def0: 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
df00: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
df10: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
df20: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
df30: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
df40: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
df50: 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
df60: 74 21 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e  t!=0 && pEList->
df70: 6e 45 78 70 72 3e 30 29 20 29 7b 20 0a 20 20 20  nExpr>0) ){ .   
df80: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
df90: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
dfa0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
dfb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
dfc0: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
dfd0: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
dfe0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
dff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e000: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
e010: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
e020: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
e030: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
e040: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
e050: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
e060: 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
e070: 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
e080: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
e090: 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
e0a0: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
e0b0: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
e0c0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e0d0: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
e0e0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
e0f0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
e100: 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
e110: 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
e120: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
e130: 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
e140: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
e150: 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
e160: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
e170: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
e180: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
e190: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
e1a0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
e1b0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
e1c0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e1d0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
e1e0: 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
e1f0: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
e200: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
e210: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
e220: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
e230: 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49    }.        keyI
e240: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
e250: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
e260: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
e270: 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  >pLeft);..      
e280: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
e290: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
e2a0: 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
e2b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
e2c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
e2d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
e2e0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
e2f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
e300: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
e310: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e320: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29   OP_Null, 0, r2)
e330: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
e340: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
e350: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
e360: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
e370: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
e380: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
e390: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
e3a0: 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
e3b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
e3c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
e3d0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
e3e0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
e3f0: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
e400: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
e410: 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
e420: 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
e430: 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
e440: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
e450: 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
e460: 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
e470: 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
e480: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
e490: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
e4a0: 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
e4b0: 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
e4c0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
e4d0: 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41         if( testA
e4e0: 64 64 72 3e 3d 30 20 26 26 20 21 73 71 6c 69 74  ddr>=0 && !sqlit
e4f0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
e500: 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
e510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e520: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
e530: 74 65 73 74 41 64 64 72 29 3b 0a 20 20 20 20 20  testAddr);.     
e540: 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20         testAddr 
e550: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
e560: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
e570: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
e580: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
e590: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
e5a0: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
e5b0: 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
e5c0: 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  id && sqlite3Exp
e5d0: 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
e5e0: 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20  &iValToIns) ){. 
e5f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e600: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e610: 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45  OP_InsertInt, pE
e620: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
e630: 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20   iValToIns);.   
e640: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e650: 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
e660: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
e670: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
e680: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
e690: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
e6a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e6c0: 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
e6d0: 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  t, r3,.         
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e700: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e710: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
e720: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e730: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
e740: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
e750: 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20  , r2, r3);.     
e760: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e780: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e790: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
e7a0: 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
e7b0: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
e7c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e7d0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
e7e0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
e7f0: 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
e800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e810: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
e820: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
e830: 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20  Table, r2);.    
e840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e850: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
e860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
e870: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
e880: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
e890: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
e8a0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
e8b0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
e8c0: 20 20 20 20 69 66 28 20 21 69 73 52 6f 77 69 64      if( !isRowid
e8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e8e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
e8f0: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
e900: 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )&keyInfo, P4_KE
e910: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
e920: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e930: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
e940: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
e950: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
e960: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
e970: 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73 20   /* If this has 
e980: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
e990: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
e9a0: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
e9b0: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
e9c0: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
e9d0: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
e9e0: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
e9f0: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
ea00: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
ea10: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49  l in iColumn.  I
ea20: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
ea30: 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20  STS, write.     
ea40: 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30   ** an integer 0
ea50: 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
ea60: 20 31 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f   1 (exists) into
ea70: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20   a memory cell. 
ea80: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f       ** and reco
ea90: 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  rd that memory c
eaa0: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a  ell in iColumn..
eab0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
eac0: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
eaf0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
eb00: 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
eb10: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
eb40: 20 77 69 74 68 20 53 45 4c 45 43 74 20 72 65 73   with SELECt res
eb50: 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ult */..      te
eb60: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
eb70: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
eb80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eb90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
eba0: 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
ebb0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
ebc0: 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
ebd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
ebe0: 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  CT );..      ass
ebf0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
ec00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ec10: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
ec20: 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
ec30: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
ec40: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
ec50: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
ec60: 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  , ++pParse->nMem
ec70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
ec80: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
ec90: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
eca0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
ecb0: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
ecc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ecd0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
ece0: 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  .iParm);.       
ecf0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
ed00: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
ed10: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
ed20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ed30: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
ed40: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
ed50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed60: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ed70: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
ed80: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
ed90: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
eda0: 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
edb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
edc0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
edd0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
ede0: 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
edf0: 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
ee00: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
ee10: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
ee20: 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
ee50: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
ee60: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
ee70: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
ee80: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
ee90: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
eea0: 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
eeb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
eec0: 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
eed0: 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20   dest.iParm;.   
eee0: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
eef0: 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
ef00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ef10: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74  .  }..  if( test
ef20: 41 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20 73  Addr>=0 ){.    s
ef30: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ef40: 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b  re(v, testAddr);
ef50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
ef60: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
ef70: 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e, 1);..  return
ef80: 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
ef90: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
efa0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
efb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
efc0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
efd0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
efe0: 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
eff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
f000: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
f010: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
f020: 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
f030: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
f040: 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
f050: 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  is a scalar expr
f060: 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67  ession.  The rig
f070: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
f080: 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61  S).** is an arra
f090: 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
f0a0: 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65  e values.  The e
f0b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
f0c0: 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a  e if the LHS is.
f0d0: 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
f0e0: 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68  hin the RHS.  Th
f0f0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65  e value of the e
f100: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b  xpression is unk
f110: 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69  nown (NULL).** i
f120: 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
f130: 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20  L or if the LHS 
f140: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
f150: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
f160: 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63  and the.** RHS c
f170: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
f180: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
f190: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f1a0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
f1b0: 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  de will jump to 
f1c0: 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
f1d0: 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
f1e0: 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
f1f0: 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
f200: 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
f210: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
f220: 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
f230: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
f240: 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
f250: 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
f260: 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
f270: 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
f280: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
f290: 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
f2a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
f2b0: 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
f2c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f2d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f2e0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
f2f0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
f300: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
f310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f320: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
f330: 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
f340: 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
f350: 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
f360: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
f370: 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
f380: 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
f390: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
f3a0: 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
f3b0: 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
f3c0: 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
f3d0: 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
f3e0: 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
f3f0: 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
f400: 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
f410: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
f420: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
f430: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
f440: 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74  rison affinity t
f450: 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65  o use */.  int e
f460: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
f470: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
f480: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b  RHS */.  int r1;
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f4a0: 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
f4b0: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64  register */.  Vd
f4c0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
f4d0: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
f4e0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f4f0: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ion */..  /* Com
f500: 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20  pute the RHS.   
f510: 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
f520: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
f530: 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70  cursor.  ** pExp
f540: 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63  r->iTable will c
f550: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
f560: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
f570: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
f580: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f590: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
f5a0: 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
f5b0: 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
f5c0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
f5d0: 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
f5e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
f5f0: 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
f600: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
f610: 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
f620: 2c 20 70 45 78 70 72 2c 20 26 72 52 68 73 48 61  , pExpr, &rRhsHa
f630: 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69  sNull);..  /* Fi
f640: 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
f650: 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
f660: 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
f670: 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
f680: 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
f690: 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
f6a0: 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
f6b0: 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
f6c0: 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66  e for.  ** P4 of
f6d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
f6e0: 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20    */.  affinity 
f6f0: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
f700: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
f710: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
f720: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
f730: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
f740: 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  )"..  */.  sqlit
f750: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
f760: 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20  pParse);.  r1 = 
f770: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f780: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
f790: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f7a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f7b0: 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  t, r1);..  /* If
f7c0: 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c   the LHS is NULL
f7d0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
f7e0: 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c 73  t is either fals
f7f0: 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64  e or NULL depend
f800: 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74  ing.  ** on whet
f810: 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65  her the RHS is e
f820: 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73  mpty or not, res
f830: 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a  pectively..  */.
f840: 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
f850: 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
f860: 0a 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74  .    /* Shortcut
f870: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
f880: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66  case where the f
f890: 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75  alse and NULL ou
f8a0: 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a  tcomes are.    *
f8b0: 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  * the same. */. 
f8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f8d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
f8e0: 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c  l, r1, destIfNul
f8f0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
f900: 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
f910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f920: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31  , OP_NotNull, r1
f930: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f940: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f950: 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
f960: 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
f970: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
f980: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f990: 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
f9a0: 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
f9b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f9c0: 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20   addr1);.  }..  
f9d0: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
f9e0: 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
f9f0: 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
fa00: 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
fa10: 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
fa20: 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20  b-tree.    */.  
fa30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fa40: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
fa50: 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46  Int, r1, destIfF
fa60: 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alse);.    sqlit
fa70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fa80: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45  OP_NotExists, pE
fa90: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
faa0: 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20  tIfFalse, r1);. 
fab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
fac0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
fad0: 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78   RHS is an index
fae0: 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a   b-tree..    */.
faf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fb00: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
fb10: 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20  nity, r1, 1, 0, 
fb20: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a  &affinity, 1);..
fb30: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
fb40: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
fb50: 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  t fails, then th
fb60: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
fb70: 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e  .    ** "x IN (.
fb80: 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
fb90: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
fba0: 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65   or NULL. If the
fbb0: 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74   set.    ** cont
fbc0: 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  ains no NULL val
fbd0: 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
fbe0: 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68  sult is 0. If th
fbf0: 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f  e set .    ** co
fc00: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
fc10: 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  re NULL values, 
fc20: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
fc30: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78  of the.    ** ex
fc40: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f  pression is also
fc50: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
fc60: 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
fc70: 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66 46 61  l==0 || destIfFa
fc80: 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
fc90: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
fca0: 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
fcb0: 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
fcc0: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74  ompile time that
fcd0: 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20 2a   the RHS.      *
fce0: 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
fcf0: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
fd00: 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68  is happens as th
fd10: 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
fd20: 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
fd30: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
fd40: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
fd50: 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ema..      **.  
fd60: 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20      ** Also run 
fd70: 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e  this branch if N
fd80: 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ULL is equivalen
fd90: 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20  t to FALSE.     
fda0: 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72   ** for this par
fdb0: 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61  ticular IN opera
fdc0: 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tor..      */.  
fdd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fde0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
fdf0: 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
fe00: 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
fe10: 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20  lse, r1, 1);..  
fe20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
fe30: 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68  * In this branch
fe40: 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  , the RHS of the
fe50: 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69   IN might contai
fe60: 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20  n a NULL and.   
fe70: 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e     ** the presen
fe80: 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20  ce of a NULL on 
fe90: 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20  the RHS makes a 
fea0: 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
feb0: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f  e.      ** outco
fec0: 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  me..      */.   
fed0: 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a     int j1, j2, j
fee0: 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 72  3;..      /* Fir
fef0: 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
ff00: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  if the LHS is co
ff10: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
ff20: 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20  HS.  If so,.    
ff30: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 72    ** then the pr
ff40: 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20  esence of NULLs 
ff50: 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 20  in the RHS does 
ff60: 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a  not matter, so j
ff70: 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ump.      ** ove
ff80: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
ff90: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a  e that follows..
ffa0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
ffb0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
ffc0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
ffd0: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
ffe0: 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a  ble, 0, r1, 1);.
fff0: 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65 20 77  .      /* Here w
10000 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61 74 69  e begin generati
10010 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  ng code that run
10020 73 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  s if the LHS is 
10030 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  not.      ** con
10040 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
10050 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61 74 65  e RHS.  Generate
10060 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65   additional code
10070 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
10080 65 73 74 73 20 74 68 65 20 52 48 53 20 66 6f 72  ests the RHS for
10090 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68 65 20   NULLs.  If the 
100a0 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  RHS contains a N
100b0 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  ULL then.      *
100c0 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  * jump to destIf
100d0 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20  Null.  If there 
100e0 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20  are no NULLs in 
100f0 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20 20 20  the RHS then.   
10100 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
10110 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20 20 20  stIfFalse..     
10120 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d 20 73   */.      j2 = s
10130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10140 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
10150 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
10160 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33      j3 = sqlite3
10170 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
10180 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
10190 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 52 68  ->iTable, 0, rRh
101a0 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20  sHasNull, 1);.  
101b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
101c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
101d0 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48 61 73  ger, -1, rRhsHas
101e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
101f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10200 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 73  (v, j3);.      s
10210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10220 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72  (v, OP_AddImm, r
10230 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a  RhsHasNull, 1);.
10240 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10250 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
10260 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
10270 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
10280 61 74 65 20 74 61 72 67 65 74 20 64 65 70 65 6e  ate target depen
10290 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
102a0 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  or not.      ** 
102b0 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
102c0 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2f   a NULL.      */
102d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
102e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
102f0 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  f, rRhsHasNull, 
10300 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
10310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10320 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
10330 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
10340 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
10350 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68 65 20  OP_Found at the 
10360 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72 61 6e  top of this bran
10370 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20 77 68  ch jumps here wh
10380 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20 20 20  en true, .      
10390 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65 20 6f  ** causing the o
103a0 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72 65 73  verall IN expres
103b0 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20  sion evaluation 
103c0 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  to fall through.
103d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
103e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
103f0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
10400 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
10410 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10420 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
10430 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
10440 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 56  (pParse, 1);.  V
10450 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10460 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
10470 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10480 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10490 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69   */../*.** Dupli
104a0 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76  cate an 8-byte v
104b0 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  alue.*/.static c
104c0 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56  har *dup8bytes(V
104d0 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
104e0 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  ar *in){.  char 
104f0 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *out = sqlite3Db
10500 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65  MallocRaw(sqlite
10510 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a  3VdbeDb(v), 8);.
10520 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
10530 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c   memcpy(out, in,
10540 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   8);.  }.  retur
10550 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65  n out;.}..#ifnde
10560 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
10570 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
10580 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
10590 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
105a0 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
105b0 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
105c0 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
105d0 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
105e0 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
105f0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
10600 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
10610 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
10620 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
10630 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
10640 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
10650 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
10660 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
10670 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
10680 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
10690 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
106a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
106b0 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
106c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
106d0 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
106e0 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
106f0 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
10700 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
10710 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  e;.    char *zV;
10720 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
10730 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
10740 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
10750 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
10760 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
10770 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
10780 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
10790 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
107a0 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
107b0 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
107c0 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
107d0 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
107e0 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
107f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10800 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65  eAddOp4(v, OP_Re
10810 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
10820 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  zV, P4_REAL);.  
10830 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
10840 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
10850 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
10860 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
10870 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
10880 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
10890 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
108a0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
108b0 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
108c0 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
108d0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
108e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
108f0 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
10900 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10910 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
10920 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
10930 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
10940 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
10950 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
10960 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
10970 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
10980 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73  u.iValue;.    as
10990 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
109a0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
109b0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
109c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
109d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
109e0 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
109f0 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
10a00 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  64 value;.    co
10a10 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
10a20 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
10a30 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
10a40 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  );.    c = sqlit
10a50 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c  e3Atoi64(z, &val
10a60 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
10a70 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
10a80 54 46 38 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  TF8);.    if( c=
10a90 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e  =0 || (c==2 && n
10aa0 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
10ab0 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20   char *zV;.     
10ac0 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
10ad0 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53  value = c==2 ? S
10ae0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
10af0 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
10b00 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
10b10 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
10b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10b30 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10b40 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
10b50 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29  0, zV, P4_INT64)
10b60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
10b70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10b80 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
10b90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10ba0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76  rMsg(pParse, "ov
10bb0 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a  ersized integer:
10bc0 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20   %s%s", negFlag 
10bd0 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a  ? "-" : "", z);.
10be0 23 65 6c 73 65 0a 20 20 20 20 20 20 63 6f 64 65  #else.      code
10bf0 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c  Real(v, z, negFl
10c00 61 67 2c 20 69 4d 65 6d 29 3b 0a 23 65 6e 64 69  ag, iMem);.#endi
10c10 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
10c20 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63  *.** Clear a cac
10c30 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  he entry..*/.sta
10c40 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
10c50 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
10c60 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79  pParse, struct y
10c70 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20  ColCache *p){.  
10c80 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29  if( p->tempReg )
10c90 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
10ca0 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
10cb0 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
10cc0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20  mpReg) ){.      
10cd0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
10ce0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
10cf0 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  g++] = p->iReg;.
10d00 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d      }.    p->tem
10d10 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pReg = 0;.  }.}.
10d20 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69  ../*.** Record i
10d30 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  n the column cac
10d40 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63  he that a partic
10d50 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ular column from
10d60 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
10d70 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64   table is stored
10d80 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
10d90 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f   register..*/.vo
10da0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
10db0 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a  cheStore(Parse *
10dc0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
10dd0 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
10de0 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
10df0 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20    int minLru;.  
10e00 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74  int idxLru;.  st
10e10 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
10e20 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 52  p;..  assert( iR
10e30 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67 69  eg>0 );  /* Regi
10e40 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
10e50 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
10e60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43   */.  assert( iC
10e70 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
10e80 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
10e90 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
10ea0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
10eb0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
10ec0 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
10ed0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
10ee0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
10ef0 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
10f00 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
10f10 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
10f20 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
10f30 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
10f40 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
10f50 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
10f60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10f70 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
10f80 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
10f90 63 68 65 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  che ) return;.. 
10fa0 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63   /* First replac
10fb0 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  e any existing e
10fc0 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
10fd0 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61  Actually, the wa
10fe0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
10ff0 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  he is currently 
11000 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61  used, we are gua
11010 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61  ranteed.  ** tha
11020 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c  t the object wil
11030 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20  l never already 
11040 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65  be in cache.  Ve
11050 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e  rify this guaran
11060 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  tee..  */.#ifnde
11070 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69  f NDEBUG.  for(i
11080 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
11090 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
110a0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
110b0 2b 2c 20 70 2b 2b 29 7b 0a 23 69 66 20 30 20 2f  +, p++){.#if 0 /
110c0 2a 20 54 68 69 73 20 63 6f 64 65 20 77 6f 6c 64  * This code wold
110d0 20 72 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72   remove the entr
110e0 79 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  y from the cache
110f0 20 69 66 20 69 74 20 65 78 69 73 74 65 64 20 2a   if it existed *
11100 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  /.    if( p->iRe
11110 67 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  g && p->iTable==
11120 69 54 61 62 20 26 26 20 70 2d 3e 69 43 6f 6c 75  iTab && p->iColu
11130 6d 6e 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  mn==iCol ){.    
11140 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
11150 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
11160 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
11170 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
11180 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  vel;.      p->iR
11190 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
111a0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
111b0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
111c0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
111d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
111e0 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30  sert( p->iReg==0
111f0 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69   || p->iTable!=i
11200 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
11210 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
11220 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64  endif..  /* Find
11230 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
11240 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
11250 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
11260 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
11270 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
11280 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11290 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
112a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
112b0 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
112c0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
112d0 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
112e0 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
112f0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
11300 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
11310 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
11320 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
11330 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
11340 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
11350 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
11360 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
11370 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
11380 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
11390 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
113a0 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
113b0 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
113c0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
113d0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
113e0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
113f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
11400 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
11410 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
11420 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
11430 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
11440 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
11450 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
11460 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
11470 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
11480 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
11490 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
114a0 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
114b0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
114c0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
114d0 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
114e0 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
114f0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
11500 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
11510 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
11520 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f  return;.  }.}../
11530 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
11540 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74  at registers bet
11550 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b  ween iReg..iReg+
11560 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67  nReg-1 are being
11570 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a   overwritten..**
11580 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65   Purge the range
11590 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72   of registers fr
115a0 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
115b0 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
115c0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
115d0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
115e0 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
115f0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
11600 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69  .  int iLast = i
11610 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a  Reg + nReg - 1;.
11620 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11630 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
11640 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11650 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11660 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
11670 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
11680 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
11690 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72  if( r>=iReg && r
116a0 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
116b0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
116c0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
116d0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
116e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
116f0 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
11700 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
11710 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
11720 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
11730 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
11740 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
11750 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
11760 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
11770 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
11780 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
11790 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
117a0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
117b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
117c0 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
117d0 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  eLevel++;.}../*.
117e0 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74  ** Remove from t
117f0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
11800 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74  any entries that
11810 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63   were added sinc
11820 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65  e the.** the pre
11830 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70 65  vious N Push ope
11840 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68  rations.  In oth
11850 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
11860 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 74  e the cache.** t
11870 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
11880 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20 61  as in N Pushes a
11890 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  go..*/.void sqli
118a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
118b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
118c0 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt N){.  int i;.
118d0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
118e0 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  he *p;.  assert(
118f0 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74   N>0 );.  assert
11900 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
11910 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50  Level>=N );.  pP
11920 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
11930 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d  l -= N;.  for(i=
11940 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11950 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11960 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11970 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
11980 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c  p->iReg && p->iL
11990 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
119a0 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
119b0 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
119c0 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
119d0 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
119e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
119f0 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65  .** When a cache
11a00 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73  d column is reus
11a10 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ed, make sure th
11a20 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20  at its register 
11a30 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
11a40 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74  available as a t
11a50 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74  emp register.  t
11a60 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68  icket #3879:  th
11a70 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73  at same.** regis
11a80 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20  ter might be in 
11a90 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c  the cache in mul
11aa0 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f  tiple places, so
11ab0 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67   be sure to.** g
11ac0 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a  et them all..*/.
11ad0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
11ae0 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
11af0 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70  egister(Parse *p
11b00 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
11b10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
11b20 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
11b30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
11b40 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11b50 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11b60 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11b70 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
11b80 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
11b90 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
11ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11bb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
11bc0 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
11bd0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
11be0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
11bf0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
11c00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11c10 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
11c20 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
11c30 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
11c40 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
11c50 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
11c60 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
11c70 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
11c80 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
11c90 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
11ca0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72  * The cursor for
11cb0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
11cc0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
11cd0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
11ce0 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   column to extra
11cf0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
11d00 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61  ut      /* Extra
11d10 63 74 20 74 68 65 20 76 61 6c 75 64 20 69 6e 74  ct the valud int
11d20 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
11d30 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c  */.){.  if( iCol
11d40 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
11d50 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
11d60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11d70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
11d80 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
11d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
11da0 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
11db0 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
11dc0 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
11dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11de0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
11df0 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  bCur, iCol, regO
11e00 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ut);.  }.  if( i
11e10 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Col>=0 ){.    sq
11e20 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
11e30 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
11e40 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
11e50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11e60 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11e70 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
11e80 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
11e90 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
11ea0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
11eb0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
11ec0 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65   register.  An e
11ed0 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65  ffort.** is made
11ee0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
11ef0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
11f00 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74  gister iReg, but
11f10 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20   this is.** not 
11f20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65  guaranteed.  The
11f30 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
11f40 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
11f50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
11f60 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
11f70 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
11f80 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
11f90 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
11fa0 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
11fb0 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
11fc0 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
11fd0 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
11fe0 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
11ff0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
12000 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
12010 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12020 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
12030 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
12040 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
12050 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
12060 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
12070 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
12080 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
12090 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
120a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
120b0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
120c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
120d0 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
120e0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
120f0 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
12100 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
12110 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
12120 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
12130 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
12140 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
12150 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
12160 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
12170 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12180 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
12190 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
121a0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
121b0 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70  ( p->iReg>0 && p
121c0 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
121d0 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
121e0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
121f0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
12200 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
12210 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12220 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
12230 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67  (pParse, p->iReg
12240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12250 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
12260 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
12270 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
12280 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
12290 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
122a0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
122b0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 73 71 6c 69  n, iReg);.  sqli
122c0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
122d0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
122e0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
122f0 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  ;.  return iReg;
12300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
12310 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
12320 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
12330 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
12340 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
12350 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
12360 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12370 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
12380 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12390 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
123a0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
123b0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
123c0 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20   p->iReg ){.    
123d0 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
123e0 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
123f0 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
12400 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12410 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
12420 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69  act that an affi
12430 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
12440 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75  occurred on iCou
12450 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  nt.** registers 
12460 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53  starting with iS
12470 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tart..*/.void sq
12480 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
12490 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72  finityChange(Par
124a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
124b0 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75  iStart, int iCou
124c0 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  nt){.  sqlite3Ex
124d0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
124e0 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43  arse, iStart, iC
124f0 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ount);.}../*.** 
12500 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12510 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
12520 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
12530 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
12540 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
12550 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
12560 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
12570 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
12580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12590 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
125a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
125b0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
125c0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
125d0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
125e0 43 61 63 68 65 20 2a 70 3b 0a 20 20 69 66 28 20  Cache *p;.  if( 
125f0 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f  NEVER(iFrom==iTo
12600 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  ) ) return;.  sq
12610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12620 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
12630 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
12640 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72  To, nReg);.  for
12650 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12660 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12670 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12680 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12690 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt x = p->iReg;.
126a0 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d      if( x>=iFrom
126b0 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67   && x<iFrom+nReg
126c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65   ){.      p->iRe
126d0 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a  g += iTo-iFrom;.
126e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
126f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12700 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74   to copy content
12710 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
12720 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
12730 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
12740 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
12750 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12760 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
12770 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12780 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
12790 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
127a0 20 69 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   i;.  if( NEVER(
127b0 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65  iFrom==iTo) ) re
127c0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
127d0 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20   i<nReg; i++){. 
127e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
127f0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
12800 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 46 72  be, OP_Copy, iFr
12810 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a 20 20  om+i, iTo+i);.  
12820 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
12830 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
12840 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
12850 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a  _COVERAGE_TEST).
12860 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
12870 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
12880 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
12890 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
128a0 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
128b0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
128c0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a  column cache..**
128d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
128e0 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
128f0 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73  assert() and tes
12900 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f  tcase() macros o
12910 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  nly.** and does 
12920 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20  not appear in a 
12930 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f  normal build..*/
12940 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
12950 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
12960 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12970 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
12980 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
12990 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
129a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
129b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
129c0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
129d0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
129e0 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
129f0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
12a00 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
12a10 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20  o ) return 1;   
12a20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d   /*NO_TEST*/.  }
12a30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
12a40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12a50 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f  DEBUG || SQLITE_
12a60 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f  COVERAGE_TEST */
12a70 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12a80 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
12a90 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
12aa0 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
12ab0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.** expression.
12ac0 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f    Attempt to sto
12ad0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
12ae0 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67  n register "targ
12af0 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  et"..** Return t
12b00 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
12b10 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
12b20 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ored..**.** With
12b30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
12b40 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61  here is no guara
12b50 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74  ntee that result
12b60 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f  s will.** be sto
12b70 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20  red in target.  
12b80 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74  The result might
12b90 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f   be stored in so
12ba0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69  me other.** regi
12bb0 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f  ster if it is co
12bc0 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73  nvenient to do s
12bd0 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
12be0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
12bf0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
12c00 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20  n code and move 
12c10 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
12c20 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65  he desired.** re
12c30 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
12c40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
12c50 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  rget(Parse *pPar
12c60 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
12c70 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
12c80 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
12c90 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65  ->pVdbe;  /* The
12ca0 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   VM under constr
12cb0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
12cc0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
12cd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
12ce0 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
12cf0 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  */.  int inReg =
12d00 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f   target;       /
12d10 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64  * Results stored
12d20 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52   in register inR
12d30 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  eg */.  int regF
12d40 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ree1 = 0;       
12d50 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
12d60 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
12d70 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
12d80 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
12d90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
12da0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
12db0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
12dc0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
12dd0 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34  t r1, r2, r3, r4
12de0 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  ;       /* Vario
12df0 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  us register numb
12e00 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ers */.  sqlite3
12e10 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12e20 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
12e30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
12e40 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
12e50 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
12e60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
12e70 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
12e80 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12e90 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
12ea0 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
12eb0 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
12ec0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
12ed0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
12ee0 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
12ef0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
12f00 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
12f10 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
12f20 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
12f30 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
12f40 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
12f50 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
12f60 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
12f70 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
12f80 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
12f90 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
12fa0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
12fb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
12fc0 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
12fd0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
12fe0 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  eg = pCol->iMem;
12ff0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
13000 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13010 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
13020 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
13030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13040 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
13050 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
13060 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
13090 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
130a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
130b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
130c0 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
130d0 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
130e0 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
130f0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
13100 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
13110 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
13120 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
13130 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
13140 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
13150 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
13160 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
13170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13180 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
13190 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
131a0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
131b0 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
131c0 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ase;.      }else
131d0 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
131e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
131f0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
13200 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a  e, pExpr->pTab,.
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13230 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
13240 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
13250 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
13260 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13270 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13280 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
13290 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
132a0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
132b0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
132c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
132d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
132e0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
132f0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
13300 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
13310 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
13320 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
13330 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
13340 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
13350 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
13360 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
13370 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
13380 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
13390 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
133a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
133b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
133c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
133d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
133e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
133f0 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20  ng8, 0, target, 
13400 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
13410 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  en, 0);.      br
13420 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13430 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
13440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13450 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
13460 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
13470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13480 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13490 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
134a0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
134b0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
134c0 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
134d0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
134e0 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
134f0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13500 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13510 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13520 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13530 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
13540 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
13550 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
13560 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
13570 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
13580 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
13590 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
135a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
135b0 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
135c0 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
135d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
135e0 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
135f0 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
13600 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
13610 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
13620 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
13630 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13640 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
13650 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
13660 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
13670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13680 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
13690 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
136a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
136b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
136c0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
136d0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
136e0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
136f0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
13700 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
13710 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
13720 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13730 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
13740 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
13750 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
13760 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
13770 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
13780 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13790 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
137a0 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20  ken[0]=='?' .   
137b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
137c0 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
137d0 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ken, 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 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n-1])==0 );.    
13800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13810 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
13820 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
13830 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20  pr->iColumn-1], 
13840 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
13850 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13860 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13870 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
13880 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
13890 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
138a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
138b0 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
138c0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
138d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
138e0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
138f0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
13900 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
13910 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
13920 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
13930 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
13940 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
13950 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
13960 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
13970 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
13980 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74        int aff, t
13990 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65  o_op;.      inRe
139a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
139b0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
139c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
139d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61  target);.      a
139e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
139f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13a00 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
13a10 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
13a20 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
13a30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
13a40 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61  .      to_op = a
13a50 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff - SQLITE_AFF_
13a60 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74  TEXT + OP_ToText
13a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13a80 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
13a90 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13aa0 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29  TE_AFF_TEXT    )
13ab0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13ac0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
13ad0 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13ae0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29  TE_AFF_NONE    )
13af0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b00 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
13b10 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49  ric || aff!=SQLI
13b20 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
13b30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b40 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
13b50 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13b60 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
13b70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b80 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
13b90 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13ba0 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29  TE_AFF_REAL    )
13bb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13bc0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
13bd0 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  xt );.      test
13be0 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
13bf0 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  ToBlob );.      
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 4e 75 6d 65 72 69 63 20 29 3b  =OP_ToNumeric );
13c20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13c30 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
13c40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13c50 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
13c60 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Real );.      if
13c70 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
13c80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13ca0 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
13cb0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13cc0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
13cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13cf0 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65  1(v, to_op, inRe
13d00 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  g);.      testca
13d10 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
13d20 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
13d30 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
13d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13d50 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
13d60 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
13d70 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  g, 1);.      bre
13d80 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
13d90 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
13da0 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
13db0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
13dc0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
13dd0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
13de0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
13df0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
13e00 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
13e10 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
13e20 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
13e30 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
13e40 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
13e50 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
13e60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13e70 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
13e80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13e90 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
13ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13eb0 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
13ec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13ed0 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
13ee0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13ef0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
13f00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
13f10 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13f20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
13f30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13f40 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
13f50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13f60 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
13f70 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
13f80 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13f90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13fa0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
13fb0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
13fc0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
13fd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
13fe0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
13ff0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
14000 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14010 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
14020 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
14030 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
14040 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
14050 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
14060 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14070 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
14080 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14090 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
140a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
140b0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
140c0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
140d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
140e0 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
140f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14100 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
14110 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14120 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14130 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14140 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
14150 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
14160 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14170 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
14180 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
14190 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
141a0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
141b0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
141c0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
141d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
141e0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
141f0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
14200 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
14210 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
14220 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55  REP2 | SQLITE_NU
14230 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
14240 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
14250 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
14260 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
14270 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
14280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14290 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
142a0 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
142b0 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
142c0 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
142d0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
142e0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
142f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
14300 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
14310 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
14320 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
14330 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
14340 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
14350 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
14360 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
14370 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
14380 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
14390 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
143a0 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
143b0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
143c0 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
143d0 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
143e0 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
143f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14400 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
14410 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
14420 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
14430 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
14440 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
14450 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
14460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14470 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
14480 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
14490 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
144a0 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
144b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
144c0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
144d0 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
144e0 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
144f0 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
14500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14510 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
14520 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14530 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
14540 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14550 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  PLUS );.      te
14560 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
14570 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  INUS );.      te
14580 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
14590 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EM );.      test
145a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
145b0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
145c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
145d0 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  TOR );.      tes
145e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
145f0 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ASH );.      tes
14600 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
14610 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65  HIFT );.      te
14620 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
14630 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74  SHIFT );.      t
14640 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14650 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
14660 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14670 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14680 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14690 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
146a0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
146b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
146c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
146d0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
146e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
146f0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
14700 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
14710 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14720 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14730 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14740 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14750 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14760 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
14770 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
14780 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
14790 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
147a0 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
147b0 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
147c0 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
147d0 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
147e0 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
147f0 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  t, 1, target);.#
14800 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14810 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
14820 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
14830 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
14840 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
14850 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
14860 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14870 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
14880 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
14890 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
148a0 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
148b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
148c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
148d0 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71  gFree1 = r1 = sq
148e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
148f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
14900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14910 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14920 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , 0, r1);.      
14930 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
14940 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14950 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14960 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14980 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
14990 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
149a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
149b0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
149c0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
149d0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
149e0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
149f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14a00 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
14a10 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
14a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14a30 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
14a40 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Not );.      ass
14a50 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
14a60 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Not );.      tes
14a70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
14a80 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  TNOT );.      te
14a90 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
14aa0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
14ab0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14ac0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14ad0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
14ae0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
14af0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
14b00 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  =0 );.      inRe
14b10 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
14b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b30 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
14b40 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
14b50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14b60 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
14b70 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
14b80 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
14b90 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
14ba0 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
14bb0 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
14bc0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
14bd0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
14be0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14bf0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
14c00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14c10 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
14c20 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
14c30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14c40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14c50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
14c60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
14c70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14c80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
14c90 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
14ca0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14cb0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
14cc0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14cd0 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
14ce0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14d00 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
14d10 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , -1);.      sql
14d20 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14d30 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
14d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14d50 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
14d60 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
14d70 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
14d80 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
14d90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
14da0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
14db0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14dc0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14dd0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14df0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14e00 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
14e10 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
14e20 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
14e30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14e40 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
14e50 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
14e60 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
14e70 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
14e80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14e90 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
14ea0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
14eb0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
14ec0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
14ed0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
14ee0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
14ef0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
14f00 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
14f10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
14f20 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
14f30 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
14f40 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
14f50 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
14f60 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
14f70 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ect */.      int
14f80 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20   nId;           
14f90 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
14fa0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
14fb0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  me in bytes */. 
14fc0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14fd0 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
14fe0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
14ff0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6f   */.      int co
15000 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
15010 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
15020 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
15030 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
15040 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15070 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
15080 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
15090 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
150a0 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
150b0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
150c0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
150d0 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
150e0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
150f0 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  nce */..      as
15100 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
15110 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15120 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
15130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15140 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  p==TK_CONST_FUNC
15150 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15160 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  se( op==TK_FUNCT
15170 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ION );.      if(
15180 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
15190 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
151a0 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
151b0 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20      pFarg = 0;. 
151c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
151d0 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70      pFarg = pExp
151e0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
151f0 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20    }.      nFarg 
15200 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d  = pFarg ? pFarg-
15210 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
15220 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15230 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15240 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
15250 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ;.      zId = pE
15260 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
15270 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74       nId = sqlit
15280 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b  e3Strlen30(zId);
15290 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
152a0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
152b0 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  n(db, zId, nId, 
152c0 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
152d0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
152e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
152f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15300 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
15310 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c  nction: %.*s()",
15320 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
15330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15340 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
15350 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
15360 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
15370 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
15380 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
15390 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
153a0 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
153b0 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
153c0 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20  y evalation of. 
153d0 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
153e0 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
153f0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
15400 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
15410 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61     if( pDef->fla
15420 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
15430 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20  _COALESCE ){.   
15440 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c       int endCoal
15450 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  esce = sqlite3Vd
15460 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15470 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15480 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20  nFarg>=2 );.    
15490 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
154a0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
154b0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
154c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
154d0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67  for(i=1; i<nFarg
154e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
154f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15500 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
15510 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f  l, target, endCo
15520 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
15530 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15540 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
15550 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20  , target, 1);.  
15560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15570 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
15580 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
15590 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
155a0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
155b0 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
155c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
155d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
155e0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
155f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15600 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15610 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
15620 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
15630 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15640 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  ..      if( pFar
15650 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20  g ){.        r1 
15660 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15670 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
15680 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  arg);.        sq
15690 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
156a0 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  sh(pParse);     
156b0 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
156c0 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
156d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
156e0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
156f0 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 31 29 3b  , pFarg, r1, 1);
15700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15710 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
15720 72 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69  rse, 1);   /* Ti
15730 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
15740 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
15750 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
15760 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
15770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
15780 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
15790 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
157a0 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
157b0 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
157c0 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
157d0 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
157e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
157f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
15800 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
15810 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
15820 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
15830 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
15840 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
15850 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
15860 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
15870 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
15880 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
15890 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
158a0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
158b0 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
158c0 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
158d0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
158e0 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
158f0 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
15900 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
15910 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
15920 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
15930 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
15940 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
15950 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
15960 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
15970 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
15980 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
15990 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
159a0 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
159b0 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
159c0 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
159d0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
159e0 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
159f0 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
15a00 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
15a10 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
15a20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
15a30 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
15a40 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
15a50 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
15a60 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
15a70 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
15a80 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
15a90 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
15aa0 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
15ab0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
15ac0 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
15ad0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
15ae0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
15af0 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
15b00 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
15b10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
15b20 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
15b30 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
15b40 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
15b50 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
15b60 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
15b70 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
15b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
15b90 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69  nstMask |= (1<<i
15ba0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15bb0 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
15bc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
15bd0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
15be0 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
15bf0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
15c00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
15c10 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
15c20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
15c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15c40 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
15c50 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15c60 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
15c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
15c80 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
15c90 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
15ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15cb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
15cc0 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
15cd0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
15ce0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
15cf0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15d00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15d10 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
15d20 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
15d30 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
15d40 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
15d50 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
15d60 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
15d70 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
15d80 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
15d90 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b      if( nFarg ){
15da0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15db0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
15dc0 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
15dd0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
15de0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15df0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15e00 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
15e10 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
15e20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
15e30 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ECT: {.      tes
15e40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
15e50 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
15e60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
15e70 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
15e80 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f  nReg = sqlite3Co
15e90 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
15ea0 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
15eb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15ec0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15ed0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
15ee0 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
15ef0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15f00 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
15f10 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
15f20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15f30 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
15f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15f50 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
15f60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
15f70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
15f80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
15f90 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
15fa0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
15fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15fc0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15fd0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
15fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15ff0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
16000 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
16010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16020 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
16030 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
16040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16050 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
16060 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
16070 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16080 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16090 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
160a0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
160b0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
160c0 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
160d0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
160e0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
160f0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
16100 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
16110 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
16120 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
16130 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
16140 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
16150 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
16160 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
16170 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
16180 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
16190 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
161a0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
161b0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
161c0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
161d0 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
161e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
161f0 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78  LItem = pExpr->x
16200 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  .pList->a;.     
16210 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
16220 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a  pLItem->pExpr;..
16230 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16240 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16250 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
16260 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16270 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
16280 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16290 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
162a0 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
162b0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
162c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
162d0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
162e0 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71  );.      r3 = sq
162f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16300 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
16310 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  4 = sqlite3GetTe
16320 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16330 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
16340 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
16350 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20  pRight, OP_Ge,. 
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c   r1, r2, r3, SQL
16380 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
16390 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20      pLItem++;.  
163a0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49      pRight = pLI
163b0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
163c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
163d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
163e0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
163f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16400 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16410 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
16420 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
16430 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
16440 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  0 );.      codeC
16450 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
16460 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
16470 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c  _Le, r1, r2, r4,
16480 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
16490 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
164a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
164b0 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72  And, r3, r4, tar
164c0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
164d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
164e0 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
164f0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16500 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16510 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72  e, r4);.      br
16520 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16530 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
16540 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
16550 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
16560 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
16570 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
16580 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16590 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
165a0 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
165b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
165c0 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
165d0 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
165e0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
165f0 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
16600 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
16610 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
16620 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
16630 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
16640 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
16650 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
16660 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
16670 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
16680 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
16690 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
166a0 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
166b0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
166c0 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
166d0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
166e0 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
166f0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
16700 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
16710 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
16720 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
16730 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
16740 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
16750 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
16760 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
16770 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
16780 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
16790 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
167a0 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
167b0 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
167c0 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
167d0 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
167e0 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
167f0 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
16800 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
16810 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
16820 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
16830 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
16840 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
16850 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
16860 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
16870 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
16880 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
16890 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
168a0 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
168b0 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
168c0 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
168d0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
168e0 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
168f0 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
16900 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
16910 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
16920 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
16930 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
16940 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
16950 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
16960 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
16970 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
16980 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
16990 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
169a0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
169b0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
169c0 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
169d0 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
169e0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
169f0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
16a00 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
16a10 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
16a20 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
16a30 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
16a40 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
16a50 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
16a60 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
16a70 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
16a80 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
16a90 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
16aa0 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
16ab0 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
16ac0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
16ad0 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
16ae0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
16af0 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
16b00 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
16b10 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
16b20 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
16b30 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16b40 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
16b50 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
16b60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16b70 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
16b80 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
16b90 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
16ba0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16bb0 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
16bc0 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
16bd0 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
16be0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16bf0 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
16c00 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
16c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16c20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
16c30 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
16c40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
16c50 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
16c60 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
16c70 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
16c80 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
16c90 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
16ca0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
16cb0 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
16cc0 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
16cd0 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
16ce0 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
16cf0 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
16d00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16d10 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
16d20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
16d30 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
16d40 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
16d50 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
16d60 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
16d70 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
16d80 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
16d90 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
16da0 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20  is really real. 
16db0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
16dc0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
16dd0 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
16de0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
16df0 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
16e00 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
16e10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16e20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16e30 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
16e40 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
16e50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16e60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16e70 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
16e80 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
16e90 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
16ea0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
16eb0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
16ec0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
16ed0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
16ee0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
16ef0 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
16f00 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
16f10 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
16f20 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
16f30 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
16f40 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
16f50 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
16f60 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
16f70 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
16f80 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
16f90 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
16fa0 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
16fb0 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
16fc0 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
16fd0 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
16fe0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
16ff0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
17000 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
17010 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
17020 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
17030 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20   pExpr->pRight. 
17040 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
17050 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
17060 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20  re is no.    ** 
17070 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20  ELSE clause and 
17080 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61  no other term ma
17090 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20  tches, then the 
170a0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
170b0 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69    ** exprssion i
170c0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
170d0 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
170e0 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
170f0 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
17100 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
17110 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17120 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
17130 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
17140 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
17150 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
17160 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
17170 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
17180 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
17190 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
171a0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
171b0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
171c0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
171d0 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
171e0 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
171f0 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
17220 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
17230 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
17240 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
17270 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
17280 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
17290 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
172c0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
172d0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
17300 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
17310 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
17320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17330 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
17340 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
17350 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17360 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
17370 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
17380 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
17390 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
173a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
173b0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
173c0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
173d0 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
173e0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
173f0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
17400 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
17410 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
17420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17440 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
17450 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
17460 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
17470 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
17480 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
17490 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
174a0 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
174b0 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
174c0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
174d0 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
174e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
174f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
17500 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
17510 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
17520 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
17530 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t((pExpr->x.pLis
17540 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d  t->nExpr % 2) ==
17550 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
17560 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
17570 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
17580 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
17590 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
175a0 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
175b0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
175c0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
175d0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
175e0 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
175f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17600 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
17610 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
17620 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
17630 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
17640 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
17650 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
17660 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17670 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52  se( pX->op==TK_R
17680 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
17690 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65     cacheX.iTable
176a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
176b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
176c0 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
176d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
176e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
176f0 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f          cacheX.o
17700 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
17710 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
17720 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
17730 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
17740 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58  .pLeft = &cacheX
17750 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
17760 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
17770 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
17780 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
17790 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
177a0 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
177b0 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
177c0 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
177d0 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
177e0 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
177f0 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
17800 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17810 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
17820 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
17830 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
17840 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
17850 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
17860 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
17870 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
17880 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
17890 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
178a0 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
178b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
178c0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
178d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
178e0 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
178f0 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
17900 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
17910 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
17920 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
17930 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
17940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
17950 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
17960 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
17970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
17980 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
17990 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
179a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
179b0 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
179c0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
179d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
179e0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
179f0 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
17a00 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
17a10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17a20 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
17a30 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
17a40 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
17a50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
17a60 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
17a70 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
17a80 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
17a90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17aa0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
17ab0 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
17ac0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
17ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17ae0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
17af0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
17b00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17b10 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
17b20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17b30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17b40 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
17b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17b60 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
17b70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17b80 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17b90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17ba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17bb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17bc0 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
17bd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17be0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
17bf0 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  rse, 1);.      }
17c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
17c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17c20 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
17c30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
17c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17c50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
17c60 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
17c70 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
17c80 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
17c90 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
17ca0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17cb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17cc0 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
17cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17ce0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
17cf0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
17d00 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
17d10 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17d20 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
17d30 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
17d40 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
17d50 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17d60 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
17d70 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
17d80 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
17d90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
17da0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
17db0 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
17dc0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
17dd0 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
17de0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17df0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17e00 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
17e10 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
17e20 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
17e30 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
17e40 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
17e50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
17e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17e70 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
17e80 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
17e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17ea0 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
17eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17ec0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
17ed0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17ee0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
17ef0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17f00 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
17f10 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
17f20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f30 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
17f40 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
17f50 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
17f60 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
17f70 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  ken,0);.      }e
17f80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
17f90 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
17fa0 6e 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  nt(pParse, pExpr
17fb0 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70  ->affinity, pExp
17fc0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
17fd0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17fe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
17ff0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
18000 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18010 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
18020 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
18030 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18040 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
18050 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
18060 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18070 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
18080 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
18090 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
180a0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
180b0 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
180c0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
180d0 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
180e0 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
180f0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
18100 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
18110 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
18120 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
18130 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
18140 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
18150 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
18160 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
18170 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
18180 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
18190 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
181a0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  to zero..*/.int 
181b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
181c0 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
181d0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
181e0 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
181f0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
18200 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
18210 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c  ;.  int r2 = sql
18220 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
18230 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
18240 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d  , r1);.  if( r2=
18250 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  =r1 ){.    *pReg
18260 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = r1;.  }else{.
18270 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
18280 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18290 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67  , r1);.    *pReg
182a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
182b0 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
182c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
182d0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
182e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
182f0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
18300 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
18310 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
18320 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
18330 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
18340 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
18350 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69  ter target..*/.i
18360 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
18370 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
18380 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
18390 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
183a0 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
183b0 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
183c0 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
183d0 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
183e0 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
183f0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
18400 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18410 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
18420 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
18430 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
18440 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
18450 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
18460 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18470 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
18480 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
18490 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
184a0 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
184b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
184c0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
184d0 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
184e0 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
184f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18500 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
18510 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
18520 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
18530 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18540 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   target;.}../*.*
18550 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18560 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
18570 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
18580 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
18590 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
185a0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
185b0 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
185c0 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
185d0 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
185e0 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
185f0 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
18600 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
18610 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
18620 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
18630 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
18640 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
18650 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
18660 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
18670 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18680 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
18690 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
186a0 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
186b0 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
186c0 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
186d0 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
186e0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
186f0 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
18700 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eused..*/.int sq
18710 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
18720 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
18730 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18740 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
18750 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
18760 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
18770 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d  inReg;.  inReg =
18780 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18790 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
187a0 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
187b0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
187c0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
187d0 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
187e0 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f  erms to INSERT o
187f0 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74  r UPDATE.  And t
18800 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  he only.  ** oth
18810 65 72 20 70 6c 61 63 65 20 77 68 65 72 65 20 65  er place where e
18820 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
18830 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
18840 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a   TK_REGISTER is.
18850 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c    ** in WHERE cl
18860 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
18870 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c    So as currentl
18880 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74  y implemented, t
18890 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20  here is.  ** no 
188a0 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47  way for a TK_REG
188b0 49 53 54 45 52 20 74 6f 20 65 78 69 73 74 20 68  ISTER to exist h
188c0 65 72 65 2e 20 20 42 75 74 20 69 74 20 73 65 65  ere.  But it see
188d0 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20  ms prudent to.  
188e0 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41  ** keep the ALWA
188f0 59 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65  YS() in case the
18900 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
18910 65 20 63 68 61 6e 67 65 20 77 69 74 68 20 66 75  e change with fu
18920 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ture.  ** modifi
18930 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e  cations or enhan
18940 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66  cements. */.  if
18950 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
18960 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29  op!=TK_REGISTER)
18970 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d   ){  .    int iM
18980 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b  em;.    iMem = +
18990 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
189a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
189b0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
189c0 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20   inReg, iMem);. 
189d0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
189e0 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78   = iMem;.    pEx
189f0 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d  pr->op2 = pExpr-
18a00 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  >op;.    pExpr->
18a10 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
18a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
18a30 6e 52 65 67 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  nReg;.}..#if def
18a40 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
18a50 47 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  G)./*.** Generat
18a60 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
18a70 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
18a80 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
18a90 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
18aa0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
18ab0 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70  (Vdbe *pOut, Exp
18ac0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
18ad0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
18ae0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
18af0 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
18b00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18b10 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20   *zBinOp = 0;   
18b20 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74  /* Binary operat
18b30 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
18b40 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20  ar *zUniOp = 0; 
18b50 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61    /* Unary opera
18b60 74 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  tor */.  if( pEx
18b70 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
18b80 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
18b90 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
18ba0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
18bb0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
18bc0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
18bd0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MN: {.      sqli
18be0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
18bf0 28 70 4f 75 74 2c 20 22 41 47 47 5f 43 4f 4c 55  (pOut, "AGG_COLU
18c00 4d 4e 28 25 73 3a 25 64 3a 25 64 29 22 2c 0a 20  MN(%s:%d:%d)",. 
18c10 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
18c20 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  ->pTab->zName, p
18c30 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
18c40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
18c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18c60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
18c70 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
18c80 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
18c90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
18ca0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
18cb0 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
18cc0 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
18cd0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
18ce0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
18cf0 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 64  pOut, "COLUMN(%d
18d00 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  )", pExpr->iColu
18d10 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
18d20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18d30 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
18d40 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 73 3a  Out, "COLUMN(%s:
18d50 25 64 3a 25 64 29 22 2c 0a 20 20 20 20 20 20 20  %d:%d)",.       
18d60 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
18d70 2d 3e 7a 4e 61 6d 65 2c 20 70 45 78 70 72 2d 3e  ->zName, pExpr->
18d80 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
18d90 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
18da0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18db0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
18dc0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
18dd0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
18de0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
18df0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18e00 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
18e10 70 4f 75 74 2c 20 22 49 4e 54 45 47 45 52 28 25  pOut, "INTEGER(%
18e20 64 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56  d)", pExpr->u.iV
18e30 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  alue);.      }el
18e40 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
18e50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
18e60 28 70 4f 75 74 2c 20 22 49 4e 54 45 47 45 52 28  (pOut, "INTEGER(
18e70 25 73 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  %s)", pExpr->u.z
18e80 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  Token);.      }.
18e90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18ea0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
18eb0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
18ec0 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
18ed0 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
18ee0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
18ef0 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 41 4c  rintf(pOut,"REAL
18f00 28 25 73 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e  (%s)", pExpr->u.
18f10 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
18f20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
18f30 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
18f40 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73  TRING: {.      s
18f50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
18f60 6e 74 66 28 70 4f 75 74 2c 22 53 54 52 49 4e 47  ntf(pOut,"STRING
18f70 28 25 73 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e  (%s)", pExpr->u.
18f80 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
18f90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18fa0 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
18fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18fc0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
18fd0 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
18fe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
18ff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19000 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
19010 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
19020 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
19030 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19040 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
19050 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19060 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
19070 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
19080 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
19090 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c  zToken[0]=='x' |
190a0 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  | pExpr->u.zToke
190b0 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20  n[0]=='X' );.   
190c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
190d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27  ->u.zToken[1]=='
190e0 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  \'' );.      z =
190f0 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   &pExpr->u.zToke
19100 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20  n[2];.      n = 
19110 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19120 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  z) - 1;.      as
19130 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27  sert( z[n]=='\''
19140 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
19150 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19160 4f 75 74 2c 22 42 4c 4f 42 28 25 2e 2a 73 29 22  Out,"BLOB(%.*s)"
19170 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 62  , n, z);.      b
19180 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
19190 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
191a0 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
191b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
191c0 72 69 6e 74 66 28 70 4f 75 74 2c 22 56 41 52 49  rintf(pOut,"VARI
191d0 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20  ABLE(%s,%d)",.  
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
19200 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d  u.zToken, pExpr-
19210 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
19220 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19230 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
19240 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
19250 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19260 28 70 4f 75 74 2c 22 52 45 47 49 53 54 45 52 28  (pOut,"REGISTER(
19270 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d)", pExpr->iTa
19280 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
19290 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
192a0 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
192b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
192c0 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
192d0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
192e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
192f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19300 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
19310 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
19320 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
19330 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
19340 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
19350 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) */.      const
19360 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 22 75   char *zAff = "u
19370 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63  nk";.      switc
19380 68 28 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  h( sqlite3Affini
19390 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
193a0 7a 54 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20  zToken) ){.     
193b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
193c0 46 46 5f 54 45 58 54 3a 20 20 20 20 7a 41 66 66  FF_TEXT:    zAff
193d0 20 3d 20 22 54 45 58 54 22 3b 20 20 20 20 20 62   = "TEXT";     b
193e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
193f0 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
19400 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 4e  NE:    zAff = "N
19410 4f 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ONE";     break;
19420 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
19430 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
19440 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52 49  : zAff = "NUMERI
19450 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  C";  break;.    
19460 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19470 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66  AFF_INTEGER: zAf
19480 66 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 20 20  f = "INTEGER";  
19490 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
194a0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  ase SQLITE_AFF_R
194b0 45 41 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20 22  EAL:    zAff = "
194c0 52 45 41 4c 22 3b 20 20 20 20 20 62 72 65 61 6b  REAL";     break
194d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
194e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
194f0 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 54  intf(pOut, "CAST
19500 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20  -%s(", zAff);.  
19510 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19520 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
19530 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
19540 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19550 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22  Printf(pOut, ")"
19560 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19570 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
19580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
19590 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
195a0 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  LT:      zBinOp 
195b0 3d 20 22 4c 54 22 3b 20 20 20 20 20 62 72 65 61  = "LT";     brea
195c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
195d0 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
195e0 20 22 4c 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "LE";     break
195f0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
19600 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
19610 22 47 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "GT";     break;
19620 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
19630 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
19640 47 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  GE";     break;.
19650 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
19660 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e       zBinOp = "N
19670 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
19680 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
19690 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51      zBinOp = "EQ
196a0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
196b0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20    case TK_IS:   
196c0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22     zBinOp = "IS"
196d0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
196e0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
196f0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f    zBinOp = "ISNO
19700 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
19710 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20  case TK_AND:    
19720 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b   zBinOp = "AND";
19730 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19740 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20  ase TK_OR:      
19750 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20  zBinOp = "OR";  
19760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19770 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a  se TK_PLUS:    z
19780 42 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20 20  BinOp = "ADD";  
19790 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
197a0 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42  e TK_STAR:    zB
197b0 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20  inOp = "MUL";   
197c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
197d0 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69   TK_MINUS:   zBi
197e0 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20  nOp = "SUB";    
197f0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19800 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e  TK_REM:     zBin
19810 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 62  Op = "REM";    b
19820 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
19830 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f  K_BITAND:  zBinO
19840 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 62 72  p = "BITAND"; br
19850 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
19860 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70  _BITOR:   zBinOp
19870 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 62 72 65   = "BITOR";  bre
19880 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
19890 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20  SLASH:   zBinOp 
198a0 3d 20 22 44 49 56 22 3b 20 20 20 20 62 72 65 61  = "DIV";    brea
198b0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
198c0 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d  SHIFT:  zBinOp =
198d0 20 22 4c 53 48 49 46 54 22 3b 20 62 72 65 61 6b   "LSHIFT"; break
198e0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
198f0 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  HIFT:  zBinOp = 
19900 22 52 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b  "RSHIFT"; break;
19910 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
19920 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  CAT:  zBinOp = "
19930 43 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a  CONCAT"; break;.
19940 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
19950 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  NUS:  zUniOp = "
19960 55 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a  UMINUS"; break;.
19970 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
19980 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55  S:   zUniOp = "U
19990 50 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20  PLUS";  break;. 
199a0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
199b0 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49  T:  zUniOp = "BI
199c0 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TNOT"; break;.  
199d0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
199e0 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54     zUniOp = "NOT
199f0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
19a00 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
19a10 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55    zUniOp = "ISNU
19a20 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL"; break;.    
19a30 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
19a40 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55   zUniOp = "NOTNU
19a50 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
19a60 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
19a70 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
19a80 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
19a90 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
19aa0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
19ab0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
19ac0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
19ad0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
19ae0 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  s */.      if( E
19af0 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
19b00 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
19b10 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
19b20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
19b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b40 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
19b50 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
19b60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
19b70 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
19b80 74 2c 20 22 25 73 46 55 4e 43 54 49 4f 4e 3a 25  t, "%sFUNCTION:%
19b90 73 28 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s(",.           
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
19bc0 49 4f 4e 20 3f 20 22 41 47 47 5f 22 20 3a 20 22  ION ? "AGG_" : "
19bd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
19bf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
19c00 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
19c10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19c20 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
19c30 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a  t(pOut, pFarg);.
19c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19c50 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19c60 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
19c70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19c80 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19c90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19ca0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
19cb0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
19cc0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19cd0 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22 29  pOut, "EXISTS(")
19ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19cf0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75  xplainSelect(pOu
19d00 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
19d10 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
19d20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19d30 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20  (pOut,")");.    
19d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19d50 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
19d60 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
19d70 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19d80 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20 20  pOut, "(");.    
19d90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19da0 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
19db0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
19dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19dd0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19de0 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
19df0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19e00 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
19e10 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19e20 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e  Printf(pOut, "IN
19e30 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
19e40 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
19e50 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
19e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19e70 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19e80 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
19e90 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
19ea0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
19eb0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
19ec0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19ed0 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70  inSelect(pOut, p
19ee0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
19ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19f10 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
19f20 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
19f30 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
19f40 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19f50 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
19f60 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
19f70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
19f80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
19f90 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
19fa0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
19fb0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
19fc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
19fd0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
19fe0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
19ff0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1a000 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1a010 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1a020 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1a030 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1a040 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1a050 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1a060 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1a070 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1a080 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1a090 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1a0a0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
1a0b0 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d  xpr *pX = pExpr-
1a0c0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
1a0d0 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e  pr *pY = pExpr->
1a0e0 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
1a0f0 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  xpr;.      Expr 
1a100 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pZ = pExpr->x.p
1a110 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1a120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a130 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a140 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b 0a  t, "BETWEEN(");.
1a150 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a160 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1a170 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  X);.      sqlite
1a180 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a190 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1a1a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1a1b0 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20  xpr(pOut, pY);. 
1a1c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a1d0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a1e0 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1a1f0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1a200 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20  Out, pZ);.      
1a210 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1a220 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1a230 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a240 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1a250 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1a260 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1a270 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1a280 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1a290 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1a2a0 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1a2b0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1a2c0 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1a2d0 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1a2e0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1a2f0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1a300 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1a310 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1a320 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1a330 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1a340 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1a350 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1a360 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1a370 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1a380 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1a390 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1a3a0 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1a3b0 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1a3c0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1a3d0 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1a3e0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1a3f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a400 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  Printf(pOut, "%s
1a410 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%d)", .        
1a420 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1a430 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c  ? "NEW" : "OLD",
1a440 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1a450 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a460 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a470 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  _CASE: {.      s
1a480 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a490 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45 28  ntf(pOut, "CASE(
1a4a0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1a4b0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1a4c0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1a4d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a4e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a4f0 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1a500 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1a510 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1a520 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1a530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a540 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a550 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
1a560 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
1a570 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1a580 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22  r *zType = "unk"
1a590 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
1a5a0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
1a5b0 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
1a5c0 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a  OE_Rollback:   z
1a5d0 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b  Type = "rollback
1a5e0 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
1a5f0 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74     case OE_Abort
1a600 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  :      zType = "
1a610 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61  abort";     brea
1a620 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1a630 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a  OE_Fail:       z
1a640 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20  Type = "fail";  
1a650 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a660 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
1a670 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  e:     zType = "
1a680 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61  ignore";    brea
1a690 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1a6a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a6b0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41 49  rintf(pOut, "RAI
1a6c0 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79 70  SE-%s(%s)", zTyp
1a6d0 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  e, pExpr->u.zTok
1a6e0 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1a6f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1a700 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20   }.  if( zBinOp 
1a710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1a720 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a730 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b  ,"%s(", zBinOp);
1a740 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1a750 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1a760 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1a770 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a780 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b  rintf(pOut,",");
1a790 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1a7a0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1a7b0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1a7c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a7d0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29  Printf(pOut,")")
1a7e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55  ;.  }else if( zU
1a7f0 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  niOp ){.    sqli
1a800 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a810 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e  (pOut,"%s(", zUn
1a820 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iOp);.    sqlite
1a830 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1a840 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1a850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1a860 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a870 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ")");.  }.}.#end
1a880 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1a890 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a 0a  LITE_DEBUG) */..
1a8a0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1a8b0 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
1a8c0 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
1a8d0 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
1a8e0 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72  ation of an expr
1a8f0 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
1a900 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
1a910 61 69 6e 45 78 70 72 4c 69 73 74 28 56 64 62 65  ainExprList(Vdbe
1a920 20 2a 70 4f 75 74 2c 20 45 78 70 72 4c 69 73 74   *pOut, ExprList
1a930 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1a940 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1a950 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  0 || pList->nExp
1a960 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1a970 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a980 28 70 4f 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c  (pOut, "(empty-l
1a990 69 73 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75  ist)");.    retu
1a9a0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
1a9b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
1a9c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1a9d0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1a9e0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1a9f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1aa00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1aa10 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 66  ush(pOut);.    f
1aa20 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1aa30 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1aa40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1aa50 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1aa60 69 74 65 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29  item[%d] = ", i)
1aa70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1aa80 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29  xplainPush(pOut)
1aa90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1aaa0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1aab0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1aac0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
1aad0 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75  e3ExplainPop(pOu
1aae0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3c  t);.      if( i<
1aaf0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
1ab00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ab10 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29  3ExplainNL(pOut)
1ab20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ab30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ab40 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d  inPop(pOut);.  }
1ab50 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1ab60 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
1ab70 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1ab80 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
1ab90 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
1aba0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
1abb0 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
1abc0 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
1abd0 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
1abe0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
1abf0 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
1ac00 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
1ac10 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
1ac20 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
1ac30 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
1ac40 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
1ac50 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
1ac60 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
1ac70 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
1ac80 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
1ac90 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1aca0 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
1acb0 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
1acc0 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
1acd0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
1ace0 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
1acf0 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
1ad00 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
1ad10 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
1ad20 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
1ad30 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
1ad40 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
1ad50 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
1ad60 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
1ad70 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
1ad80 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
1ad90 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
1ada0 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
1adb0 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
1adc0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
1add0 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
1ade0 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
1adf0 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
1ae00 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
1ae10 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1ae20 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
1ae30 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
1ae40 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
1ae50 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
1ae60 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
1ae70 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
1ae80 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
1ae90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1aea0 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
1aeb0 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
1aec0 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
1aed0 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
1aee0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
1aef0 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
1af00 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
1af10 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
1af20 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
1af30 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
1af40 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
1af50 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
1af60 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
1af70 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
1af80 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
1af90 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
1afa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1afb0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1afc0 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
1afd0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
1afe0 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
1aff0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
1b000 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
1b010 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1b020 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1b030 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
1b040 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1b050 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
1b060 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1b070 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
1b080 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b090 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
1b0a0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
1b0b0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
1b0c0 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
1b0d0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1b0e0 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
1b0f0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1b100 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
1b110 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
1b120 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
1b130 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
1b140 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
1b150 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
1b160 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
1b170 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
1b180 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
1b190 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
1b1a0 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
1b1b0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
1b1c0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
1b1d0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
1b1e0 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
1b1f0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1b200 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
1b210 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1b220 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65        if( p->pLe
1b230 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1b240 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   || p->pLeft->op
1b250 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
1b260 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1b270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b280 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b290 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1b2a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b2b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1b2c0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ../*.** If pExpr
1b2d0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
1b2e0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
1b2f0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
1b300 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f  r.** factoring o
1b310 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68  ut of a loop, th
1b320 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
1b330 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e  expression.** in
1b340 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
1b350 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78  d convert the ex
1b360 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20  pression into a 
1b370 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65  TK_REGISTER.** e
1b380 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1b390 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e  atic int evalCon
1b3a0 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70  stExpr(Walker *p
1b3b0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
1b3c0 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  xpr){.  Parse *p
1b3d0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1b3e0 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63  >pParse;.  switc
1b3f0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1b400 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
1b410 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1b420 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
1b430 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1b440 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b450 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
1b460 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1b470 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1b480 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a  K_CONST_FUNC: {.
1b490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67        /* The arg
1b4a0 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63  uments to a func
1b4b0 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65  tion have a fixe
1b4c0 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  d destination.. 
1b4d0 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65       ** Mark the
1b4e0 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76  m this way to av
1b4f0 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e  oid generated un
1b500 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a  needed OP_SCopy.
1b510 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
1b520 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f  tions. .      */
1b530 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1b540 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
1b550 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
1b560 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1b570 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1b580 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1b590 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
1b5a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1b5b0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1b5c0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1b5d0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1b5e0 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1b5f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69  .        for(; i
1b600 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1b610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1b620 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70   ALWAYS(pItem->p
1b630 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70  Expr) ) pItem->p
1b640 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
1b650 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
1b660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b670 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b680 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
1b690 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
1b6a0 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
1b6b0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
1b6c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1b6d0 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
1b6e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1b6f0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1b700 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
1b710 69 66 28 20 4e 45 56 45 52 28 72 31 21 3d 72 32  if( NEVER(r1!=r2
1b720 29 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ) ) sqlite3Relea
1b730 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b740 2c 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72  , r1);.    pExpr
1b750 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f  ->op2 = pExpr->o
1b760 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  p;.    pExpr->op
1b770 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
1b780 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1b790 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75  e = r2;.    retu
1b7a0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1b7b0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1b7c0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1b7d0 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f  * Preevaluate co
1b7e0 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73  nstant subexpres
1b7f0 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78  sions within pEx
1b800 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
1b810 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
1b820 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66  egisters.  Modif
1b830 79 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  y pExpr so that 
1b840 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62  the constant sub
1b850 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72  expresions.** ar
1b860 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70  e TK_REGISTER op
1b870 63 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72  codes that refer
1b880 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75   to the precompu
1b890 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a  ted values..**.*
1b8a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b8b0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
1b8c0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f 6f   jump to the coo
1b8d0 6b 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20 68  kie-check code h
1b8e0 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  as.** already oc
1b8f0 63 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65 20  cur.  Since the 
1b900 63 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75 6d  cookie-check jum
1b910 70 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 70  p is generated p
1b920 72 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20 6f  rior to.** any o
1b930 74 68 65 72 20 73 65 72 69 6f 75 73 20 70 72 6f  ther serious pro
1b940 63 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63 68  cessing, this ch
1b950 65 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61 74  eck ensures that
1b960 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
1b970 77 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74 6c  way to accidentl
1b980 79 20 62 79 70 61 73 73 20 74 68 65 20 63 6f 6e  y bypass the con
1b990 73 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61  stant initializa
1b9a0 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
1b9b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 73  s routine is als
1b9c0 6f 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  o a no-op if the
1b9d0 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75   SQLITE_FactorOu
1b9e0 74 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61 74  tConst optimizat
1b9f0 69 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c  ion.** is disabl
1ba00 65 64 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ed via the sqlit
1ba10 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ba20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ba30 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a 2a  OPTIMIZATIONS).*
1ba40 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68  * interface.  Th
1ba50 69 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20 6c  is allows test l
1ba60 6f 67 69 63 20 74 6f 20 76 65 72 69 66 79 20 74  ogic to verify t
1ba70 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
1ba80 77 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  wer is.** obtain
1ba90 65 64 20 66 6f 72 20 71 75 65 72 69 65 73 20 72  ed for queries r
1baa0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1bab0 74 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e 73  ther or not cons
1bac0 74 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72 65  tants are.** pre
1bad0 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65  computed into re
1bae0 67 69 73 74 65 72 73 20 6f 72 20 69 66 20 74 68  gisters or if th
1baf0 65 79 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ey are inserted 
1bb00 69 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  in-line..*/.void
1bb10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bb20 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
1bb30 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1bb40 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
1bb50 77 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  w;.  if( pParse-
1bb60 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72 65  >cookieGoto ) re
1bb70 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 50 61  turn;.  if( (pPa
1bb80 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1bb90 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75   SQLITE_FactorOu
1bba0 74 43 6f 6e 73 74 29 21 3d 30 20 29 20 72 65 74  tConst)!=0 ) ret
1bbb0 75 72 6e 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  urn;.  w.xExprCa
1bbc0 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e  llback = evalCon
1bbd0 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c  stExpr;.  w.xSel
1bbe0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
1bbf0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1bc00 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1bc10 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
1bc20 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  r);.}.../*.** Ge
1bc30 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1bc40 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
1bc50 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
1bc60 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
1bc70 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
1bc80 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
1bc90 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
1bca0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
1bcb0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
1bcc0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1bcd0 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
1bce0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1bcf0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1bd00 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
1bd10 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
1bd20 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1bd30 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1bd40 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
1bd50 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
1bd60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1bd70 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
1bd80 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
1bd90 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
1bda0 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20  t doHardCopy    
1bdb0 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20   /* Make a hard 
1bdc0 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c  copy of every el
1bdd0 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  ement */.){.  st
1bde0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1bdf0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1be00 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   i, n;.  assert(
1be10 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
1be20 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1be30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1be40 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
1be50 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
1be60 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
1be70 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
1be80 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
1be90 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1bea0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
1beb0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
1bec0 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
1bed0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  ->pExpr;.    int
1bee0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1bef0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1bf00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1bf10 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66 28  rget+i);.    if(
1bf20 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69   inReg!=target+i
1bf30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bf40 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1bf50 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f 48 61 72  se->pVdbe, doHar
1bf60 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f 70 79 20  dCopy ? OP_Copy 
1bf70 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  : OP_SCopy,.    
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 69 6e 52 65 67 2c 20 74 61 72 67 65      inReg, targe
1bfa0 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+i);.    }.  }.
1bfb0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
1bfc0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1bfd0 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
1bfe0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
1bff0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
1c000 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
1c010 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
1c020 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
1c030 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
1c040 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
1c050 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
1c060 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
1c070 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
1c080 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e  .** elementation
1c090 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   of x..*/.static
1c0a0 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65   void exprCodeBe
1c0b0 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  tween(.  Parse *
1c0c0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
1c0d0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1c0e0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1c0f0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
1c100 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
1c110 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69  BETWEEN expressi
1c120 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
1c130 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
1c140 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75  p here if the ju
1c150 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  mp is taken */. 
1c160 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c   int jumpIfTrue,
1c170 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
1c180 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
1c190 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  EN is true */.  
1c1a0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
1c1b0 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1c1c0 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1c1d0 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  N is NULL */.){.
1c1e0 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20    Expr exprAnd; 
1c1f0 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f      /* The AND o
1c200 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79  perator in  x>=y
1c210 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20   AND x<=z  */.  
1c220 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20  Expr compLeft;  
1c230 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20    /* The  x>=y  
1c240 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63  term */.  Expr c
1c250 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54  ompRight;   /* T
1c260 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a  he  x<=z  term *
1c270 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20  /.  Expr exprX; 
1c280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20        /* The  x 
1c290 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
1c2a0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
1c2b0 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61   = 0; /* Tempora
1c2c0 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
1c2d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  */..  assert( !E
1c2e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c2f0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c300 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
1c310 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
1c320 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
1c330 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
1c340 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
1c350 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
1c360 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
1c370 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
1c380 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
1c390 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
1c3a0 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
1c3b0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
1c3c0 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
1c3d0 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
1c3e0 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
1c3f0 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
1c400 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
1c410 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
1c420 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1c430 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
1c440 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
1c450 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1c460 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26  Parse, &exprX, &
1c470 72 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78 70  regFree1);.  exp
1c480 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  rX.op = TK_REGIS
1c490 54 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49  TER;.  if( jumpI
1c4a0 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c  fTrue ){.    sql
1c4b0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1c4c0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
1c4d0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1c4e0 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
1c4f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1c500 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70  lse(pParse, &exp
1c510 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
1c520 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  IfNull);.  }.  s
1c530 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c540 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1c550 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Free1);..  /* En
1c560 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65  sure adequate te
1c570 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  st coverage */. 
1c580 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1c590 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1c5a0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1c5b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1c5c0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1c5d0 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1c5e0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1c5f0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1c600 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1c610 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1c620 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
1c630 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1c640 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1c650 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1c660 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1c670 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1c680 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1c690 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1c6a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1c6b0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1c6c0 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1c6d0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1c6e0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1c6f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1c700 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1c710 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1c720 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1c730 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1c740 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1c750 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1c760 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0 );.}../*.** 
1c770 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1c780 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
1c790 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
1c7a0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
1c7b0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
1c7c0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
1c7d0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
1c7e0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
1c7f0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
1c800 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
1c810 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
1c820 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
1c830 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
1c840 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
1c850 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
1c860 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
1c870 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
1c880 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
1c890 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
1c8a0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
1c8b0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
1c8c0 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
1c8d0 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
1c8e0 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
1c8f0 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
1c900 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
1c910 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
1c920 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
1c930 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
1c940 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
1c950 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
1c960 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
1c970 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
1c980 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
1c990 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
1c9a0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
1c9b0 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
1c9c0 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
1c9d0 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
1c9e0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1c9f0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
1ca00 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
1ca10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1ca20 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
1ca30 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ca40 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1ca50 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1ca60 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1ca70 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1ca80 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1ca90 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1caa0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1cab0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1cac0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1cad0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1cae0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1caf0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1cb00 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1cb10 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
1cb20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42  Existance of VDB
1cb30 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
1cb40 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
1cb50 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
1cb60 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
1cb70 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
1cb80 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
1cb90 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
1cba0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1cbb0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
1cbc0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
1cbd0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1cbe0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cbf0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1cc00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cc10 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1cc20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1cc30 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1cc40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1cc50 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
1cc60 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
1cc70 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
1cc80 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1cc90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1cca0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1ccb0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1ccc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1ccd0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
1cce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ccf0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1cd00 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
1cd10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1cd20 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1cd30 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1cd40 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1cd50 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1cd60 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1cd70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1cd80 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1cd90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1cda0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1cdb0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
1cdc0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1cdd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cde0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
1cdf0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1ce00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ce10 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ce20 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1ce30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ce40 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1ce50 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1ce60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ce70 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1ce80 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1ce90 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1cea0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1ceb0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1cec0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1ced0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
1cee0 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
1cef0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
1cf00 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
1cf10 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
1cf20 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
1cf30 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
1cf40 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1cf50 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
1cf60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1cf70 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
1cf80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cf90 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
1cfa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1cfb0 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
1cfc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1cfd0 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
1cfe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
1cff0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1d000 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
1d010 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d020 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
1d030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1d040 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1d050 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1d060 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d070 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1d080 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1d090 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1d0a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1d0b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1d0c0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1d0d0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1d0e0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1d0f0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1d100 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
1d130 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1d140 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1d150 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1d160 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1d170 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1d180 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d190 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1d1a0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b  case TK_ISNOT: {
1d1b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d1c0 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
1d1d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d1e0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1d1f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1d200 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1d210 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1d220 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1d230 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1d240 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d250 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1d260 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1d270 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
1d280 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
1d290 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63  : TK_NE;.      c
1d2a0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1d2b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d2c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1d2d0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1d2e0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1d2f0 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  st, SQLITE_NULLE
1d300 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
1d310 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1d320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d330 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1d340 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d350 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d360 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1d370 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1d380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1d390 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1d3a0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
1d3b0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1d3c0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
1d3d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d3e0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1d3f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1d400 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1d410 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1d420 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1d430 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1d440 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1d450 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d460 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1d470 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
1d480 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1d490 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1d4a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d4b0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
1d4c0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
1d4d0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1d4e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
1d4f0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
1d500 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
1d510 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b   1, jumpIfNull);
1d520 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d530 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1d540 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1d550 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1d560 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
1d570 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
1d580 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d590 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
1d5a0 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
1d5b0 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
1d5c0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
1d5d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d5e0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
1d5f0 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
1d600 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1d610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d620 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1d630 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
1d640 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1d650 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1d660 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
1d670 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1d680 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1d690 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
1d6a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1d6b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
1d6c0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1d6d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d6e0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
1d6f0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
1d700 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74  ull!=0);.      t
1d710 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1d720 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1d730 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1d740 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ll==0 );.      b
1d750 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1d760 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1d770 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1d780 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1d790 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1d7a0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1d7b0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
1d7c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1d7d0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1d7e0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1d7f0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1d800 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1d810 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1d820 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1d830 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
1d840 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1d850 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1d860 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1d870 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
1d880 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1d890 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1d8a0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1d8b0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
1d8c0 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
1d8d0 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
1d8e0 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
1d8f0 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
1d900 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
1d910 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d920 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
1d930 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d940 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1d950 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1d960 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d970 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d980 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1d990 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1d9a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1d9b0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1d9c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1d9d0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1d9e0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1d9f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1da00 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1da10 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
1da20 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20  istance of VDBE 
1da30 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1da40 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
1da50 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
1da60 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
1da70 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
1da80 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
1da90 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1daa0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
1dab0 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
1dac0 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
1dad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
1dae0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
1daf0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
1db00 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
1db10 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
1db20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
1db30 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
1db40 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1db60 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
1db70 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
1db80 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
1db90 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
1dba0 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
1dbb0 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
1dbc0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
1dbd0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1dbf0 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
1dc00 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
1dc10 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
1dc20 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
1dc30 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
1dc40 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
1dc50 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
1dc60 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
1dc70 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1dc80 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
1dc90 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
1dca0 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
1dcb0 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
1dcc0 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
1dcd0 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
1dce0 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
1dcf0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1dd00 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
1dd10 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
1dd20 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
1dd30 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
1dd40 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
1dd50 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
1dd60 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
1dd70 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
1dd80 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
1dd90 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1dda0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
1ddb0 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
1ddc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1ddd0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
1dde0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
1ddf0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1de00 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
1de10 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
1de20 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1de30 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
1de40 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
1de50 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1de60 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
1de70 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
1de80 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1de90 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
1dea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1deb0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
1dec0 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
1ded0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1dee0 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
1def0 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
1df00 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1df10 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1df20 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1df30 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1df40 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1df50 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1df60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1df70 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1df80 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1df90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1dfa0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1dfb0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1dfc0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1dfd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dfe0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1dff0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
1e000 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1e010 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
1e020 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e030 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e040 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1e050 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1e060 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1e070 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1e080 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
1e090 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1e0a0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1e0b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1e0c0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1e0d0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
1e0e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e0f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e100 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e110 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
1e120 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1e130 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
1e140 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e150 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1e160 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e170 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e180 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e190 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1e1a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e1b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e1c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e1d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e1e0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1e1f0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1e200 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1e210 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1e220 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1e230 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_EQ: {.      te
1e240 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1e250 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1e260 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
1e270 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e280 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
1e290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e2a0 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
1e2b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e2c0 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
1e2d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e2e0 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
1e2f0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e300 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1e310 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e320 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e330 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e340 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1e350 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e360 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e370 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1e380 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1e390 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1e3a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e3b0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e3c0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1e3d0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1e3e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e3f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e400 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e410 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e420 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1e430 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e440 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1e450 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1e460 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1e470 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1e480 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1e490 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1e4a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
1e4b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e4c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e4d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e4e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e4f0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1e500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e510 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e520 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e530 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
1e540 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
1e550 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
1e560 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _EQ;.      codeC
1e570 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1e580 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1e590 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1e5c0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
1e5d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e5e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e5f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e600 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1e610 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e620 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1e630 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1e640 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1e650 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e660 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1e670 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e680 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
1e690 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e6a0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e6b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e6c0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e6e0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1e6f0 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
1e700 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e710 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
1e720 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e730 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1e740 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e750 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1e760 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
1e770 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
1e780 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30  , pExpr, dest, 0
1e790 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e7a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e7b0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e7c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1e7d0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1e7e0 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
1e7f0 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
1e800 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e810 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1e820 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
1e830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e840 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1e850 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
1e860 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1e870 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e880 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1e890 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
1e8a0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1e8b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1e8c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1e8d0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1e8e0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1e8f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e900 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1e910 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e920 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e930 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
1e940 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1e950 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e960 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65  OP_IfNot, r1, de
1e970 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
1e980 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  0);.      testca
1e990 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e9a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e9b0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1e9c0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e9d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1e9e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1e9f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1ea00 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
1ea10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1ea20 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
1ea30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  .}../*.** Do a d
1ea40 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
1ea50 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
1ea60 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
1ea70 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  0 if the two.** 
1ea80 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1ea90 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74  completely ident
1eaa0 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20  ical.  Return 1 
1eab0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f  if they differ o
1eac0 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c  nly.** by a COLL
1ead0 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20  ATE operator at 
1eae0 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20  the top level.  
1eaf0 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72  Return 2 if ther
1eb00 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65  e are difference
1eb10 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20  s.** other than 
1eb20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f  the top-level CO
1eb30 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
1eb40 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
1eb50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1eb60 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
1eb70 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1eb80 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
1eb90 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
1eba0 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
1ebb0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
1ebc0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
1ebd0 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
1ebe0 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
1ebf0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
1ec00 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1ec10 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
1ec20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
1ec30 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
1ec40 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
1ec50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1ec60 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
1ec70 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
1ec80 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
1ec90 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
1eca0 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
1ecb0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1ecc0 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
1ecd0 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
1ece0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
1ecf0 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
1ed00 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
1ed10 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
1ed20 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
1ed30 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
1ed40 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
1ed50 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
1ed60 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
1ed70 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
1ed80 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
1ed90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1eda0 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
1edb0 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
1edc0 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d   if( pA==0||pB==
1edd0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ede0 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
1edf0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45    }.  assert( !E
1ee00 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1ee10 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  y(pA, EP_TokenOn
1ee20 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
1ee30 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
1ee40 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
1ee50 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pB, EP_TokenOnly
1ee60 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1ee70 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1ee80 70 65 72 74 79 28 70 41 2c 20 45 50 5f 78 49 73  perty(pA, EP_xIs
1ee90 53 65 6c 65 63 74 29 20 7c 7c 20 45 78 70 72 48  Select) || ExprH
1eea0 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45  asProperty(pB, E
1eeb0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1eec0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
1eed0 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
1eee0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
1eef0 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
1ef00 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
1ef10 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70  eturn 2;.  if( p
1ef20 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
1ef30 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
1ef40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1ef50 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
1ef60 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
1ef70 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 2;.  if( sqlit
1ef80 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
1ef90 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
1efa0 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 32  ight) ) return 2
1efb0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
1efc0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
1efd0 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
1efe0 78 2e 70 4c 69 73 74 29 20 29 20 72 65 74 75 72  x.pList) ) retur
1eff0 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 2;.  if( pA->i
1f000 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
1f010 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
1f020 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
1f030 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
1f040 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f050 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pA, EP_IntValue)
1f060 20 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70   ){.    if( !Exp
1f070 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
1f080 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
1f090 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70   pA->u.iValue!=p
1f0a0 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
1f0b0 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
1f0c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1f0d0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
1f0e0 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
1f0f0 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  en ){.    if( Ex
1f100 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1f110 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
1f120 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54  | NEVER(pB->u.zT
1f130 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75 72  oken==0) ) retur
1f140 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 74 72  n 2;.    if( str
1f150 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  cmp(pA->u.zToken
1f160 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
1f170 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1f180 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
1f190 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
1f1a0 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
1f1b0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
1f1c0 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 20  P_ExpCollate) ) 
1f1d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1f1e0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1f1f0 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20 26  ExpCollate)!=0 &
1f200 26 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d  & pA->pColl!=pB-
1f210 3e 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20  >pColl ) return 
1f220 32 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  2;.  return 0;.}
1f230 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1f240 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
1f250 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
1f260 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
1f270 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
1f280 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
1f290 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
1f2a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f2b0 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
1f2c0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
1f2d0 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
1f2e0 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
1f2f0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
1f300 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
1f310 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
1f320 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
1f330 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
1f340 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
1f350 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
1f360 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
1f370 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
1f380 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
1f390 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
1f3a0 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
1f3b0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
1f3c0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
1f3d0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
1f3e0 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
1f3f0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
1f400 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1f410 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
1f420 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
1f430 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
1f440 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  B){.  int i;.  i
1f450 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
1f460 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f470 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
1f480 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1f490 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
1f4a0 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
1f4b0 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
1f4c0 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
1f4d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1f4e0 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
1f4f0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
1f500 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
1f510 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
1f520 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
1f530 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
1f540 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
1f550 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
1f560 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1f570 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20  pExprA, pExprB) 
1f580 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1f590 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1f5a0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
1f5b0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
1f5c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
1f5d0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
1f5e0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
1f5f0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
1f600 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
1f610 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
1f620 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
1f630 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
1f640 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
1f650 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
1f660 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
1f670 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
1f680 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1f690 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
1f6a0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
1f6b0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
1f6c0 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
1f6d0 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20  ]),.       3,.  
1f6e0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
1f6f0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49  lumn,.       &pI
1f700 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f  nfo->nColumnAllo
1f710 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
1f720 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
1f730 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
1f740 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1f750 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
1f760 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
1f770 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1f780 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
1f790 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
1f7a0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
1f7b0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
1f7c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1f7d0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
1f7e0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
1f7f0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
1f800 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
1f810 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
1f820 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1f830 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
1f840 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
1f850 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
1f860 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
1f870 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
1f880 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
1f890 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
1f8a0 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26  cAlloc,.       &
1f8b0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
1f8c0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
1f8d0 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
1f8e0 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
1f8f0 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
1f900 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
1f910 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
1f920 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1f930 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
1f940 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1f950 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
1f960 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1f970 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
1f980 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
1f990 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
1f9a0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
1f9b0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
1f9c0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1f9d0 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
1f9e0 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
1f9f0 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
1fa00 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
1fa10 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
1fa20 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
1fa30 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1fa40 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
1fa50 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1fa60 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1fa70 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
1fa80 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
1fa90 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
1faa0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1fab0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
1fac0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fad0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1fae0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
1faf0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1fb00 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
1fb10 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
1fb20 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
1fb30 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
1fb40 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1fb50 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
1fb60 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
1fb70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
1fb80 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1fb90 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1fba0 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
1fbb0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1fbc0 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
1fbd0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1fbe0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1fbf0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1fc00 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
1fc10 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1fc20 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
1fc30 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1fc40 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
1fc50 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
1fc60 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
1fc70 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
1fc80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1fc90 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1fca0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
1fcb0 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
1fcc0 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
1fcd0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
1fce0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1fcf0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
1fd00 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
1fd10 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
1fd20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
1fd30 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
1fd40 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
1fd50 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
1fd60 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
1fd70 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
1fd80 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
1fd90 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
1fda0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
1fdb0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
1fdc0 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
1fdd0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
1fde0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1fdf0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1fe00 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1fe20 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
1fe30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
1fe40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe50 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
1fe60 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
1fe70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fe80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fe90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1feb0 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
1fec0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1fee0 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
1fef0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
1ff00 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
1ff10 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1ff30 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1ff40 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
1ff50 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
1ff60 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
1ff70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1ff80 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
1ff90 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1ffa0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1ffb0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
1ffc0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
1ffd0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1ffe0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1fff0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
20000 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
20010 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
20020 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
20030 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
20040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20050 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
20060 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
20070 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
20080 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
20090 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
200a0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
200b0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
200c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
200d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
200e0 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
20100 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
20120 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
20130 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
20140 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
20150 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
20160 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
20170 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
20180 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
20190 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
201a0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
201d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
201e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
201f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
20200 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20230 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20270 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
20280 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
20290 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
202a0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
202b0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
202c0 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
202d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
202e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
202f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
20300 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
20310 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
20320 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
20330 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
20340 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
20350 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
20360 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
20370 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
20380 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
20390 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
203a0 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
203b0 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
203c0 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
203d0 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
203e0 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
203f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
20400 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
20410 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70  SetIrreducible(p
20420 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
20430 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
20440 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
20450 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
20460 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
20470 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
20480 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
20490 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
204a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
204b0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
204c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
204d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
204e0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
204f0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
20500 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
20510 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
20520 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
20530 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
20540 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
20550 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70  /* The pNC->nDep
20560 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65  th==0 test cause
20570 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
20580 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72  tions in subquer
20590 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ies.      ** to 
205a0 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20  be ignored */.  
205b0 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65      if( pNC->nDe
205c0 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pth==0 ){.      
205d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
205e0 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
205f0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
20600 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
20610 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
20620 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
20630 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
20640 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
20650 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
20660 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
20670 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
20680 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
20690 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
206a0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
206b0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
206c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
206d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
206e0 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
206f0 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20   pExpr)==0 ){.  
20700 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
20710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20730 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
20740 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
20750 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
20760 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
20770 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
20780 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
20790 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
207a0 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
207b0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
207c0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
207d0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
207e0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
207f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
20800 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
20810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
20820 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20830 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
20840 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
20850 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
20860 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
20870 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
20880 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
20890 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
208a0 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
208b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
208c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
208d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
208e0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
208f0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
20900 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
20910 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
20920 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
20930 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
20940 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
20950 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
20960 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
20970 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
20990 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
209a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
209b0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
209c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
209d0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
209e0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
20a00 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
20a10 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
20a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
20a30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
20a40 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
20a50 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
20a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20a70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20a80 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
20a90 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
20aa0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
20ab0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
20ac0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
20ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
20ae0 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
20af0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
20b00 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
20b10 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
20b20 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
20b30 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
20b40 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
20b50 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
20b60 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
20b70 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
20b80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
20b90 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
20ba0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20bb0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
20bc0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
20bd0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
20be0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
20bf0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
20c00 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f  elect){.  NameCo
20c10 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
20c20 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69  lker->u.pNC;.  i
20c30 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
20c40 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  0 ){.    pNC->nD
20c50 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  epth++;.    sqli
20c60 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
20c70 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b  alker, pSelect);
20c80 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
20c90 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  --;.    return W
20ca0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73  RC_Prune;.  }els
20cb0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  e{.    return WR
20cc0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
20cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
20ce0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
20cf0 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
20d00 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
20d10 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
20d20 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
20d30 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
20d40 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
20d50 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  aAgg[] array..**
20d60 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   Make additional
20d70 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
20d80 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
20d90 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
20da0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
20db0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
20dc0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
20dd0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
20de0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
20df0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
20e00 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
20e10 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
20e20 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
20e30 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
20e40 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
20e50 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
20e60 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
20e70 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
20e80 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
20e90 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
20ea0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
20eb0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
20ec0 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
20ed0 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
20ee0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
20ef0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
20f00 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
20f10 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
20f20 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
20f30 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
20f40 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
20f50 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
20f60 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
20f70 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
20f80 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
20f90 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
20fa0 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
20fb0 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
20fc0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
20fd0 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
20fe0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
20ff0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
21000 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21010 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21020 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
21030 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
21040 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
21050 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
21060 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
21070 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21080 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
21090 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
210a0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
210b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
210c0 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
210d0 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
210e0 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
210f0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
21100 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
21110 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
21120 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
21130 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
21140 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
21150 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
21160 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
21170 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
21180 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
21190 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
211a0 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
211b0 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
211c0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
211d0 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
211e0 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
211f0 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
21200 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
21210 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
21220 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
21230 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c   then.** the dal
21240 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
21250 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
21260 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
21270 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
21280 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
21290 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
212a0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
212b0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
212c0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
212d0 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
212e0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
212f0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
21300 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
21310 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
21320 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
21330 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
21340 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
21350 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
21360 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
21370 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
21380 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
21390 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
213a0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
213b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
213c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
213d0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
213e0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
213f0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
21400 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
21410 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
21420 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
21430 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
21440 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
21450 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
21460 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
21470 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
21480 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
21490 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
214a0 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
214b0 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
214c0 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
214d0 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
214e0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
214f0 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
21500 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
21510 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
21520 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
21530 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
21540 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
21550 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
21560 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
21570 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
21580 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
21590 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
215a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
215b0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
215c0 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  Reg){.  sqlite3E
215d0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
215e0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
215f0 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
21600 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
21610 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
21620 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
21630 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
21640 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
21650 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
21660 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
21670 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
21680 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
21690 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
216a0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
216b0 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
216c0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
216d0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
216e0 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
216f0 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a        ngeReg = 0;.}.