/ Hex Artifact Content
Login

Artifact 9ac5831769dddee6a55b07cdd439b21929bbe4e7:


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 2f 2a 0a 2a 2a 20 52  nReg;.}../*.** R
18a40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45  eturn TRUE if pE
18a50 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61  xpr is an consta
18a60 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
18a70 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
18a80 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69  e.** for factori
18a90 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
18aa0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
18ab0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a  xpressions are:.
18ac0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
18ad0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
18ae0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f  evaluates to two
18af0 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73   or more opcodes
18b00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  ..**.**    *  An
18b10 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50  y OP_Integer, OP
18b20 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67  _Real, OP_String
18b30 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75  , OP_Blob, OP_Nu
18b40 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72  ll, .**       or
18b50 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61   OP_Variable tha
18b60 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
18b70 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
18b80 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63  a .**       spec
18b90 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a  ific register..*
18ba0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  *.** There is no
18bb0 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72   point in factor
18bc0 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69  ing out single-i
18bd0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
18be0 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
18bf0 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ns that need to 
18c00 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70  be placed in a p
18c10 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
18c20 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c  er.  .** We coul
18c30 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75  d factor them ou
18c40 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77  t, but then we w
18c50 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69  ould end up addi
18c60 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70  ng an.** OP_SCop
18c70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  y instruction to
18c80 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
18c90 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
18ca0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74   register.** lat
18cb0 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  er.  We might as
18cc0 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74   well just use t
18cd0 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74  he original inst
18ce0 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61  ruction and.** a
18cf0 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70  void the OP_SCop
18d00 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
18d10 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
18d20 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20  rFactoring(Expr 
18d30 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69  *p){.  if( !sqli
18d40 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
18d50 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20  tNotJoin(p) ){. 
18d60 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
18d70 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65   Only constant e
18d80 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61  xpressions are a
18d90 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66  ppropriate for f
18da0 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a  actoring */.  }.
18db0 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
18dc0 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d  & EP_FixedDest)=
18dd0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
18de0 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73   1;  /* Any cons
18df0 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66  tant without a f
18e00 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
18e10 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
18e20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
18e30 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
18e40 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  ) p = p->pLeft;.
18e50 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
18e60 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
18e70 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
18e80 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
18e90 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20  BLOB:.#endif.   
18ea0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
18eb0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
18ec0 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
18ed0 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
18ee0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
18ef0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
18f00 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
18f10 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f  e( p->op==TK_BLO
18f20 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  B );.      testc
18f30 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56  ase( p->op==TK_V
18f40 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20  ARIABLE );.     
18f50 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
18f60 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a  ==TK_INTEGER );.
18f70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18f80 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  p->op==TK_FLOAT 
18f90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18fa0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  e( p->op==TK_NUL
18fb0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
18fc0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  ase( p->op==TK_S
18fd0 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f  TRING );.      /
18fe0 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  * Single-instruc
18ff0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77  tion constants w
19000 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74  ith a fixed dest
19010 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ination are.    
19020 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65    ** better done
19030 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65   in-line.  If we
19040 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68   factor them, th
19050 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64  ey will just end
19060 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e  .      ** up gen
19070 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43  erating an OP_SC
19080 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  opy to move the 
19090 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73  value to the des
190a0 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  tination.      *
190b0 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20  * register. */. 
190c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
190d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
190e0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
190f0 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f   if( p->pLeft->o
19100 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
19110 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
19120 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
19130 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19140 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
19150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
19160 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
19170 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
19180 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
19190 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
191a0 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
191b0 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
191c0 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
191d0 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
191e0 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76   a loop, then ev
191f0 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
19200 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20  ssion.** into a 
19210 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e  register and con
19220 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
19230 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45  ion into a TK_RE
19240 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73  GISTER.** expres
19250 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
19260 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70  int evalConstExp
19270 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
19280 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
19290 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
192a0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
192b0 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  se;.  switch( pE
192c0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
192d0 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63  ase TK_IN:.    c
192e0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
192f0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
19300 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
19310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
19320 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
19330 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
19340 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
19350 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  ST_FUNC: {.     
19360 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
19370 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  s to a function 
19380 68 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73  have a fixed des
19390 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  tination..      
193a0 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69  ** Mark them thi
193b0 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67  s way to avoid g
193c0 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65  enerated unneede
193d0 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20  d OP_SCopy.     
193e0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
193f0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
19400 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19410 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
19420 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
19430 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
19440 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
19450 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
19460 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
19470 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c        int i = pL
19480 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
19490 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
194a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
194b0 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  = pList->a;.    
194c0 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69      for(; i>0; i
194d0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
194e0 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
194f0 59 53 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  YS(pItem->pExpr)
19500 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d   ) pItem->pExpr-
19510 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78  >flags |= EP_Fix
19520 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20  edDest;.        
19530 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
19540 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
19550 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72  .  if( isAppropr
19560 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
19570 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
19580 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65  nt r1 = ++pParse
19590 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20  ->nMem;.    int 
195a0 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  r2;.    r2 = sql
195b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
195c0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
195d0 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e  , r1);.    if( N
195e0 45 56 45 52 28 72 31 21 3d 72 32 29 20 29 20 73  EVER(r1!=r2) ) s
195f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19600 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
19610 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32  ;.    pExpr->op2
19620 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
19630 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
19640 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70  _REGISTER;.    p
19650 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72  Expr->iTable = r
19660 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  2;.    return WR
19670 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
19680 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
19690 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ue;.}../*.** Pre
196a0 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e  evaluate constan
196b0 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  t subexpressions
196c0 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e   within pExpr an
196d0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
196e0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
196f0 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78  ers.  Modify pEx
19700 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  pr so that the c
19710 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
19720 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f  sions.** are TK_
19730 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73  REGISTER opcodes
19740 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
19750 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76  he precomputed v
19760 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alues..**.** Thi
19770 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
19780 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 75 6d 70  o-op if the jump
19790 20 74 6f 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63   to the cookie-c
197a0 68 65 63 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a  heck code has.**
197b0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 2e 20   already occur. 
197c0 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69   Since the cooki
197d0 65 2d 63 68 65 63 6b 20 6a 75 6d 70 20 69 73 20  e-check jump is 
197e0 67 65 6e 65 72 61 74 65 64 20 70 72 69 6f 72 20  generated prior 
197f0 74 6f 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20  to.** any other 
19800 73 65 72 69 6f 75 73 20 70 72 6f 63 65 73 73 69  serious processi
19810 6e 67 2c 20 74 68 69 73 20 63 68 65 63 6b 20 65  ng, this check e
19820 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 72  nsures that ther
19830 65 20 69 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74  e is no.** way t
19840 6f 20 61 63 63 69 64 65 6e 74 6c 79 20 62 79 70  o accidently byp
19850 61 73 73 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  ass the constant
19860 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73   initializations
19870 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19880 74 69 6e 65 20 69 73 20 61 6c 73 6f 20 61 20 6e  tine is also a n
19890 6f 2d 6f 70 20 69 66 20 74 68 65 20 53 51 4c 49  o-op if the SQLI
198a0 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
198b0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  t optimization.*
198c0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 76 69  * is disabled vi
198d0 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65  a the sqlite3_te
198e0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
198f0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
19900 49 5a 41 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74  IZATIONS).** int
19910 65 72 66 61 63 65 2e 20 20 54 68 69 73 20 61 6c  erface.  This al
19920 6c 6f 77 73 20 74 65 73 74 20 6c 6f 67 69 63 20  lows test logic 
19930 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
19940 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 20 69  he same answer i
19950 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f  s.** obtained fo
19960 72 20 71 75 65 72 69 65 73 20 72 65 67 61 72 64  r queries regard
19970 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
19980 6f 72 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73  or not constants
19990 20 61 72 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75   are.** precompu
199a0 74 65 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ted into registe
199b0 72 73 20 6f 72 20 69 66 20 74 68 65 79 20 61 72  rs or if they ar
199c0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69  e inserted in-li
199d0 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ne..*/.void sqli
199e0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
199f0 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61 72  ants(Parse *pPar
19a00 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
19a10 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
19a20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
19a30 69 65 47 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b  ieGoto ) return;
19a40 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
19a50 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19a60 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
19a70 74 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  t)!=0 ) return;.
19a80 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
19a90 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70  k = evalConstExp
19aa0 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  r;.  w.xSelectCa
19ab0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
19ac0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
19ad0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
19ae0 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
19af0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
19b00 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
19b10 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
19b20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
19b30 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
19b40 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
19b50 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
19b60 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
19b70 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
19b80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
19b90 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
19ba0 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a  nts evaluated..*
19bb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
19bc0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
19bd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19be0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
19bf0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
19c00 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
19c10 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
19c20 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
19c30 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
19c40 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
19c50 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
19c60 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48  lts */.  int doH
19c70 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d  ardCopy     /* M
19c80 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20  ake a hard copy 
19c90 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
19ca0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
19cb0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
19cc0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
19cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
19ce0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
19cf0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
19d00 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19d10 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
19d20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
19d30 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
19d40 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
19d50 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
19d60 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
19d70 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
19d80 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
19d90 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
19da0 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52 65  pr;.    int inRe
19db0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
19dc0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
19dd0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
19de0 69 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65  i);.    if( inRe
19df0 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
19e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e10 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
19e20 56 64 62 65 2c 20 64 6f 48 61 72 64 43 6f 70 79  Vdbe, doHardCopy
19e30 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
19e40 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
19e60 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
19e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19e80 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
19e90 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
19ea0 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
19eb0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
19ec0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
19ed0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
19ee0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
19ef0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
19f00 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
19f10 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
19f20 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
19f30 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
19f40 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
19f50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
19f60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19f70 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
19f80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19f90 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
19fa0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
19fb0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
19fc0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
19fd0 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
19fe0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
19ff0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1a000 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1a010 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
1a020 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   taken */.  int 
1a030 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a  jumpIfTrue,   /*
1a040 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
1a050 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
1a060 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   true */.  int j
1a070 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
1a080 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1a090 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1a0a0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  NULL */.){.  Exp
1a0b0 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
1a0c0 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
1a0d0 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
1a0e0 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
1a0f0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
1a100 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
1a110 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
1a120 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
1a130 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
1a140 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
1a150 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
1a160 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1a170 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1a180 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
1a190 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
1a1a0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1a1b0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1a1c0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1a1d0 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
1a1e0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
1a1f0 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
1a200 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
1a210 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
1a220 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
1a230 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
1a240 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
1a250 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
1a260 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1a270 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
1a280 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1a290 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1a2a0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
1a2b0 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
1a2c0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
1a2d0 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
1a2e0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
1a2f0 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
1a300 78 70 72 3b 0a 20 20 65 78 70 72 58 2e 69 54 61  xpr;.  exprX.iTa
1a310 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
1a320 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1a330 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
1a340 65 65 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70  ee1);.  exprX.op
1a350 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
1a360 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65    if( jumpIfTrue
1a370 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1a380 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1a390 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
1a3a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1a3c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1a3d0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
1a3e0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1a3f0 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
1a400 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a410 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1a420 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
1a430 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
1a440 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
1a450 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a460 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1a470 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1a480 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1a490 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1a4a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1a4b0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1a4c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a4d0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1a4e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1a4f0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1a500 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1a510 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1a520 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1a530 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1a540 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a550 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1a560 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1a570 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1a580 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1a590 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1a5a0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1a5b0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1a5c0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1a5d0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1a5e0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1a5f0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1a600 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1a610 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1a620 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1a630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1a640 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1a650 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1a660 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1a670 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1a680 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1a690 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1a6a0 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
1a6b0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
1a6c0 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
1a6d0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
1a6e0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
1a6f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1a700 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1a710 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1a720 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1a730 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
1a740 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1a750 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
1a760 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
1a770 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
1a780 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
1a790 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
1a7a0 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
1a7b0 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
1a7c0 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
1a7d0 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
1a7e0 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
1a7f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
1a800 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1a810 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
1a820 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
1a830 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
1a840 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
1a850 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
1a860 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
1a870 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
1a880 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
1a890 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
1a8a0 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
1a8b0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
1a8c0 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
1a8d0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
1a8e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
1a8f0 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
1a900 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1a910 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1a920 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1a930 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1a940 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1a950 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1a960 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1a970 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1a980 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1a990 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1a9a0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1a9b0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1a9c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1a9d0 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72  ER(v==0) )     r
1a9e0 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74  eturn;  /* Exist
1a9f0 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ance of VDBE che
1aa00 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1aa10 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  /.  if( NEVER(pE
1aa20 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  xpr==0) ) return
1aa30 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69  ;  /* No way thi
1aa40 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a  s can happen */.
1aa50 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
1aa60 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1aa70 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
1aa80 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
1aa90 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1aaa0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1aab0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1aac0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1aad0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1aae0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1aaf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ab00 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1ab10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ab20 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
1ab30 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1ab40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ab50 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1ab60 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1ab70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ab80 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1ab90 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1aba0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
1abb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1abc0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
1abd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1abe0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1abf0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
1ac00 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1ac10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ac20 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1ac30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ac40 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1ac50 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1ac60 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1ac70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ac80 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1ac90 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1aca0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1acb0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1acc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1acd0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ace0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1acf0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1ad00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ad10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ad20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ad30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ad40 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1ad50 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1ad60 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1ad70 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1ad80 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1ad90 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
1ada0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
1adb0 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
1adc0 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
1add0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ade0 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
1adf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ae00 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
1ae10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ae20 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
1ae30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1ae40 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
1ae50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ae60 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
1ae70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ae80 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
1ae90 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
1aea0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1aeb0 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
1aec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1aed0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
1aee0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1aef0 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
1af00 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1af10 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1af20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1af30 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1af40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1af50 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1af60 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1af70 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1af80 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1af90 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1afa0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1afb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1afc0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1afd0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1afe0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1aff0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1b000 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ull);.      test
1b010 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1b020 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1b030 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1b040 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1b050 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b060 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1b070 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
1b080 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1b090 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1b0a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1b0b0 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  ISNOT );.      r
1b0c0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1b0d0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1b0e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1b0f0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1b100 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1b110 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1b120 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b130 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1b140 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1b150 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1b160 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  NE;.      codeCo
1b170 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1b180 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1b190 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1b1c0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1b1d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1b1e0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1b1f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1b200 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1b210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b220 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1b230 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1b240 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1b250 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
1b260 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
1b270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1b280 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1b290 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74  tNull );.      t
1b2a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1b2b0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1b2c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1b2d0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1b2e0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1b2f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1b300 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1b310 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1b320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b330 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1b340 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1b350 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1b360 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1b370 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1b380 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1b390 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b3a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1b3b0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1b3c0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1b3d0 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a  Expr, dest, 1, j
1b3e0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1b3f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1b400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b410 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1b420 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1b430 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
1b440 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
1b450 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1b460 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1b470 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
1b480 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
1b490 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
1b4a0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1b4b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1b4c0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
1b4d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1b4e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b4f0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1b500 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
1b510 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1b520 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
1b530 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1b540 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1b550 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1b560 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1b570 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1b580 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1b590 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1b5a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b5b0 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
1b5c0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
1b5d0 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  0);.      testca
1b5e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1b5f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b600 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1b610 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1b620 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1b630 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1b640 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1b650 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
1b660 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b670 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
1b680 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
1b690 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1b6a0 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1b6b0 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1b6c0 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1b6d0 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1b6e0 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1b6f0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
1b700 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1b710 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1b720 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1b730 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
1b740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1b750 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1b760 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1b770 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1b780 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
1b790 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
1b7a0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1b7b0 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
1b7c0 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
1b7d0 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
1b7e0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1b7f0 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
1b800 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1b810 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1b820 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1b830 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b840 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1b850 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1b860 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1b870 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1b880 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1b890 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1b8a0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1b8b0 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1b8c0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1b8d0 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
1b8e0 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e  turn; /* Existan
1b8f0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1b900 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1b910 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1b920 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
1b930 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
1b940 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
1b950 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
1b960 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1b970 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
1b980 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
1b990 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
1b9a0 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
1b9b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
1b9c0 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
1b9d0 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
1b9e0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1b9f0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
1ba00 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
1ba10 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
1ba20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
1ba30 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
1ba50 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1ba60 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
1ba70 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
1ba80 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
1ba90 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
1baa0 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
1bab0 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
1bac0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1bae0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
1baf0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
1bb00 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
1bb10 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
1bb20 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
1bb30 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
1bb40 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
1bb50 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
1bb60 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
1bb70 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
1bb80 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
1bb90 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1bba0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
1bbb0 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
1bbc0 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
1bbd0 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
1bbe0 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
1bbf0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
1bc00 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
1bc10 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
1bc20 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
1bc30 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
1bc40 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1bc50 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1bc60 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1bc70 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
1bc80 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
1bc90 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1bca0 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
1bcb0 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
1bcc0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1bcd0 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
1bce0 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
1bcf0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1bd00 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
1bd10 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
1bd20 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1bd30 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
1bd40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1bd50 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
1bd60 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
1bd70 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1bd80 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
1bd90 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
1bda0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1bdb0 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
1bdc0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
1bdd0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1bde0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
1bdf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1be00 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1be10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1be20 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1be30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1be40 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1be50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1be60 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1be70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1be80 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1be90 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1bea0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1beb0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
1bec0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
1bed0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1bee0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bef0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1bf00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bf10 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1bf20 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1bf30 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1bf40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1bf50 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
1bf60 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1bf70 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1bf80 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1bf90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bfa0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1bfb0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1bfc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1bfd0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
1bfe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bff0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1c000 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
1c010 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c020 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1c030 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1c040 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1c050 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1c060 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1c070 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1c080 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1c090 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c0a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1c0b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1c0c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1c0d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1c0e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1c0f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1c100 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1c110 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
1c120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c130 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
1c140 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c150 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
1c160 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1c170 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
1c180 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
1c190 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c1a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
1c1b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c1c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1c1d0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1c1e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c1f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c200 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1c210 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1c220 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1c230 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1c240 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1c250 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
1c260 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1c270 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1c280 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1c2b0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1c2c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1c2d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1c2e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1c2f0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1c300 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c310 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1c320 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1c330 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1c340 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1c350 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1c360 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1c370 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1c380 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1c390 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c3a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1c3b0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1c3c0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1c3d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c3e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1c3f0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1c400 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
1c410 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
1c420 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
1c430 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1c440 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1c450 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1c460 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1c480 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1c490 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1c4a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1c4b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1c4c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1c4d0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1c4e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c4f0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1c500 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1c510 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ULL: {.      tes
1c520 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1c530 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
1c540 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1c550 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1c560 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1c570 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1c580 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1c590 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1c5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c5b0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
1c5c0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
1c5d0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1c5e0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1c5f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c600 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1c610 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1c620 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1c630 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1c640 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1c650 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d  pr, dest, 0, jum
1c660 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1c670 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1c680 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c690 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1c6a0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1c6b0 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c    if( jumpIfNull
1c6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c6d0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1c6e0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1c6f0 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
1c700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1c710 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
1c720 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c730 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
1c740 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c750 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1c760 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75  , dest, destIfNu
1c770 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
1c780 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1c790 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
1c7a0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
1c7b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c7c0 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1c7d0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
1c7e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c7f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1c800 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1c810 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c820 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1c830 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  Not, r1, dest, j
1c840 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
1c850 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1c860 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1c870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1c880 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1c890 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c8a0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
1c8b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1c8c0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1c8d0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1c8e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1c8f0 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
1c900 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
1c910 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
1c920 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1c930 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
1c940 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
1c950 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c  ssions are compl
1c960 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e  etely identical.
1c970 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
1c980 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a  ey differ only.*
1c990 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  * by a COLLATE o
1c9a0 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74  perator at the t
1c9b0 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72  op level.  Retur
1c9c0 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65  n 2 if there are
1c9d0 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20   differences.** 
1c9e0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74  other than the t
1c9f0 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45  op-level COLLATE
1ca00 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
1ca10 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
1ca20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1ca30 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68  urn 2 even if th
1ca40 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
1ca50 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
1ca60 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
1ca70 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
1ca80 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
1ca90 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
1caa0 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
1cab0 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61   2 just to be sa
1cac0 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
1cad0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
1cae0 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64  ns 2, then you d
1caf0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
1cb00 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
1cb10 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
1cb20 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
1cb30 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
1cb40 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72  u get a 0 or 1 r
1cb50 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
1cb60 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
1cb70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
1cb80 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
1cb90 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
1cba0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1cbb0 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
1cbc0 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
1cbd0 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20  et an extra 2 - 
1cbe0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
1cbf0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
1cc00 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
1cc10 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
1cc20 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
1cc30 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f  orrect 0 or 1 co
1cc40 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
1cc50 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
1cc60 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
1cc70 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
1cc80 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 66 28 20  xpr *pB){.  if( 
1cc90 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a  pA==0||pB==0 ){.
1cca0 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
1ccb0 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
1ccc0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ccd0 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c  sAnyProperty(pA,
1cce0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1ccf0 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61  _Reduced) );.  a
1cd00 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1cd10 6e 79 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45  nyProperty(pB, E
1cd20 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1cd30 65 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28  educed) );.  if(
1cd40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1cd50 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pA, EP_xIsSelec
1cd60 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  t) || ExprHasPro
1cd70 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73  perty(pB, EP_xIs
1cd80 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
1cd90 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
1cda0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
1cdb0 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
1cdc0 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
1cdd0 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
1cde0 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70   2;.  if( pA->op
1cdf0 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
1ce00 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 2;.  if( sqlit
1ce10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
1ce20 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
1ce30 66 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ft) ) return 2;.
1ce40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1ce50 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
1ce60 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
1ce70 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1ce80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
1ce90 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
1cea0 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
1ceb0 73 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  st) ) return 2;.
1cec0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
1ced0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
1cee0 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
1cef0 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
1cf00 6e 20 32 3b 0a 20 20 69 66 28 20 45 78 70 72 48  n 2;.  if( ExprH
1cf10 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  asProperty(pA, E
1cf20 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20  P_IntValue) ){. 
1cf30 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
1cf40 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49  roperty(pB, EP_I
1cf50 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e  ntValue) || pA->
1cf60 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e  u.iValue!=pB->u.
1cf70 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
1cf80 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
1cf90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e    }else if( pA->
1cfa0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
1cfb0 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
1cfc0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1cfd0 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1cfe0 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56  IntValue) || NEV
1cff0 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d  ER(pB->u.zToken=
1d000 3d 30 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  =0) ) return 2;.
1d010 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
1d020 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
1d030 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
1d040 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1d050 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1d060 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1d070 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 28 70 42  ExpCollate)!=(pB
1d080 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1d090 43 6f 6c 6c 61 74 65 29 20 29 20 72 65 74 75 72  Collate) ) retur
1d0a0 6e 20 31 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e  n 1;.  if( (pA->
1d0b0 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1d0c0 6c 6c 61 74 65 29 21 3d 30 20 26 26 20 70 41 2d  llate)!=0 && pA-
1d0d0 3e 70 43 6f 6c 6c 21 3d 70 42 2d 3e 70 43 6f 6c  >pColl!=pB->pCol
1d0e0 6c 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  l ) return 2;.  
1d0f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1d100 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
1d110 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
1d120 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
1d130 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
1d140 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
1d150 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
1d160 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
1d170 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d180 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e  might return non
1d190 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61  -zero for equiva
1d1a0 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20  lent ExprLists. 
1d1b0 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e   The.** only con
1d1c0 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65  sequence will be
1d1d0 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69   disabled optimi
1d1e0 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  zations.  But th
1d1f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  is routine.** mu
1d200 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20  st never return 
1d210 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70  0 if the two Exp
1d220 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72  rList objects ar
1d230 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a  e different, or.
1d240 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ** a malfunction
1d250 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a   will result..**
1d260 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69  .** Two NULL poi
1d270 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64  nters are consid
1d280 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73  ered to be the s
1d290 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c  ame.  But a NULL
1d2a0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61   pointer.** alwa
1d2b0 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ys differs from 
1d2c0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
1d2d0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1d2e0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
1d2f0 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20  e(ExprList *pA, 
1d300 45 78 70 72 4c 69 73 74 20 2a 70 42 29 7b 0a 20  ExprList *pB){. 
1d310 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
1d320 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
1d330 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1d340 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
1d350 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1d360 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
1d370 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
1d380 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
1d390 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1d3a0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
1d3b0 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
1d3c0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
1d3d0 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
1d3e0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
1d3f0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
1d400 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
1d410 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
1d420 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1d430 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
1d440 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65 74  A, pExprB) ) ret
1d450 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
1d460 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1d470 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
1d480 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
1d490 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
1d4a0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1d4b0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
1d4c0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
1d4d0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
1d4e0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
1d4f0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
1d500 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
1d510 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
1d520 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
1d530 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
1d540 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
1d550 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1d560 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
1d570 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
1d580 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
1d590 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
1d5a0 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
1d5b0 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
1d5c0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
1d5d0 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20  nColumnAlloc,.  
1d5e0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
1d5f0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
1d600 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1d610 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
1d620 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
1d630 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
1d640 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1d650 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
1d660 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
1d670 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
1d680 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
1d690 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
1d6a0 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
1d6b0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
1d6c0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
1d6d0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
1d6e0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
1d6f0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
1d700 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
1d710 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
1d720 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
1d730 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  nc[0]),.       3
1d740 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1d750 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
1d760 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f  pInfo->nFuncAllo
1d770 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
1d780 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
1d790 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
1d7a0 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
1d7b0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
1d7c0 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
1d7d0 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
1d7e0 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
1d7f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1d800 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
1d810 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1d820 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
1d830 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1d840 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1d850 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
1d860 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
1d870 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
1d880 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
1d890 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
1d8a0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
1d8b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d8c0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
1d8d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
1d8e0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
1d8f0 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
1d900 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
1d910 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
1d920 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
1d930 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1d940 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
1d950 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
1d960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d970 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
1d980 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
1d990 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1d9a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1d9b0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
1d9c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1d9d0 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
1d9e0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
1d9f0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
1da00 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
1da10 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
1da20 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
1da30 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
1da40 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
1da50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1da60 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
1da70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
1da80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
1da90 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1daa0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1dab0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1dac0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
1dad0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1dae0 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1daf0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
1db00 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
1db10 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
1db20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
1db30 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
1db40 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
1db50 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
1db60 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
1db70 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
1db80 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
1db90 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
1dba0 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
1dbb0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1dbc0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
1dbd0 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
1dbe0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
1dbf0 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
1dc00 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
1dc10 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
1dc20 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
1dc40 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
1dc50 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
1dc60 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1dc70 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1dc90 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
1dca0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
1dcb0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
1dcc0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
1dcd0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
1dce0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
1dcf0 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
1dd00 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1dd20 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
1dd30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1dd50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1dd60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dd70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1dd80 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
1dd90 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
1dda0 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
1ddb0 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
1ddc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
1ddd0 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
1dde0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1ddf0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
1de00 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1de10 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
1de20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
1de30 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
1de40 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1de50 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
1de60 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
1de70 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
1de80 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
1de90 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1dea0 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
1deb0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1dec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1ded0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1dee0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
1def0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
1df00 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
1df10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
1df20 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
1df30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1df40 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1df60 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
1df70 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
1df80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1df90 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1dfa0 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
1dfb0 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
1dfc0 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
1dfd0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
1dfe0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1dff0 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
1e000 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1e010 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
1e020 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e040 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1e050 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
1e060 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
1e070 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e090 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
1e0a0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1e0d0 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1e0f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1e100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e130 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
1e140 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1e150 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1e160 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1e170 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
1e180 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
1e190 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
1e1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e1c0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
1e1d0 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
1e1e0 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
1e1f0 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
1e200 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e210 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
1e220 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
1e230 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
1e240 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
1e250 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
1e260 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
1e270 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
1e280 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
1e290 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
1e2a0 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
1e2b0 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
1e2c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e2d0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72         ExprSetIr
1e2e0 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
1e2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1e300 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
1e310 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1e320 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
1e330 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
1e340 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
1e350 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
1e360 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
1e370 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1e380 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
1e390 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
1e3a0 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
1e3b0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
1e3c0 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
1e3d0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1e3e0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1e3f0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  e;.    }.    cas
1e400 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
1e410 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
1e420 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  e pNC->nDepth==0
1e430 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67   test causes agg
1e440 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1e450 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20   in subqueries. 
1e460 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67       ** to be ig
1e470 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  nored */.      i
1e480 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
1e490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1e4a0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1e4b0 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
1e4c0 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
1e4d0 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
1e4e0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
1e4f0 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
1e500 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
1e510 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
1e520 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
1e530 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1e540 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
1e550 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
1e560 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
1e570 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1e580 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1e590 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1e5a0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
1e5b0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
1e5c0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
1e5d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e5f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
1e600 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
1e610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1e620 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
1e630 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
1e640 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
1e650 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
1e660 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e670 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
1e680 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
1e690 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
1e6a0 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
1e6b0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
1e6c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1e6d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e6e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e6f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e700 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1e710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1e720 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
1e730 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
1e740 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
1e750 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
1e760 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1e770 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
1e780 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1e790 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e7a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e7b0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e7c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1e7d0 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
1e7e0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1e7f0 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e810 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1e820 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n, sqlite3Strlen
1e830 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
1e840 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
1e850 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
1e860 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
1e870 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
1e880 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
1e890 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
1e8a0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
1e8b0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1e8c0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1e8d0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
1e8e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1e8f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
1e910 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
1e920 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
1e930 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e950 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
1e960 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
1e970 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
1e980 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
1e990 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e9a0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e9b0 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
1e9c0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1e9d0 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1e9e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
1e9f0 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70  Irreducible(pExp
1ea00 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  r);.        pExp
1ea10 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
1ea20 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1ea30 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
1ea40 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
1ea50 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1ea60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ea70 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1ea80 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
1ea90 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
1eaa0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
1eab0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1eac0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1ead0 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
1eae0 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
1eaf0 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e  >u.pNC;.  if( pN
1eb00 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
1eb10 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
1eb20 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  +;.    sqlite3Wa
1eb30 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1eb40 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
1eb50 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
1eb60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1eb70 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  une;.  }else{.  
1eb80 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1eb90 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tinue;.  }.}../*
1eba0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
1ebb0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
1ebc0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
1ebd0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1ebe0 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
1ebf0 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
1ec00 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
1ec10 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
1ec20 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
1ec30 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
1ec40 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
1ec50 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
1ec60 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
1ec70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ec80 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
1ec90 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
1eca0 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1ecb0 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
1ecc0 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
1ecd0 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
1ece0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1ecf0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1ed00 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
1ed10 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
1ed20 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
1ed30 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1ed40 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
1ed50 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
1ed60 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
1ed70 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
1ed80 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
1ed90 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
1eda0 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
1edb0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
1edc0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
1edd0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
1ede0 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
1edf0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
1ee00 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
1ee10 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
1ee20 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1ee30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1ee40 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
1ee50 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1ee60 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
1ee70 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
1ee80 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
1ee90 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1eea0 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
1eeb0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
1eec0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
1eed0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1eee0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1eef0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
1ef00 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
1ef10 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1ef20 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1ef30 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1ef40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1ef50 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1ef60 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
1ef70 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
1ef80 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1ef90 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
1efa0 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
1efb0 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
1efc0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
1efd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1efe0 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
1eff0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
1f000 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1f010 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1f020 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
1f030 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1f040 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1f050 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
1f060 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
1f070 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
1f080 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
1f090 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
1f0a0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
1f0b0 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
1f0c0 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
1f0d0 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
1f0e0 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
1f0f0 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
1f100 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
1f110 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
1f120 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
1f130 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
1f140 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
1f150 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
1f160 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
1f170 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f180 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1f190 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1f1a0 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
1f1b0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1f1c0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1f1d0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
1f1e0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
1f1f0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1f200 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
1f210 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1f220 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1f230 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1f240 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
1f250 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1f260 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1f270 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1f280 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1f290 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
1f2a0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1f2b0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
1f2c0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1f2d0 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
1f2e0 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
1f2f0 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
1f300 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
1f310 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
1f320 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
1f330 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
1f340 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
1f350 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
1f360 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
1f370 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
1f380 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
1f390 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73  .    assert( !us
1f3a0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1f3b0 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31  pParse, i, i+n-1
1f3c0 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) );.    pParse-
1f3d0 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
1f3e0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
1f3f0 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
1f400 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
1f410 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
1f420 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
1f430 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
1f440 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
1f450 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
1f460 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
1f470 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1f480 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
1f490 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1f4a0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1f4b0 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20  , iReg, nReg);. 
1f4c0 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
1f4d0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
1f4e0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
1f4f0 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
1f500 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
1f510 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
1f520 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
1f530 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1f540 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
1f550 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
1f560 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
1f570 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
1f580 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1f590 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
1f5a0 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
1f5b0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1f5c0 67 20 3d 20 30 3b 0a 7d 0a                       g = 0;.}.