/ Hex Artifact Content
Login

Artifact 96d029a9b7b5c012cc00ce11c38215fb7d13488b:


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 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c  m->pSchema = pOl
7340: 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a  dItem->pSchema;.
7350: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
7360: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
7370: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7380: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
7390: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
73a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
73b0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
73c0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
73d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
73e0: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
73f0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7400: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
7410: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e    pNewItem->join
7420: 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  type = pOldItem-
7430: 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70  >jointype;.    p
7440: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
7450: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
7460: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
7470: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
7480: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72  = pOldItem->addr
7490: 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65  FillSub;.    pNe
74a0: 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  wItem->regReturn
74b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67   = pOldItem->reg
74c0: 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4e 65 77  Return;.    pNew
74d0: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
74e0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ed = pOldItem->i
74f0: 73 43 6f 72 72 65 6c 61 74 65 64 3b 0a 20 20 20  sCorrelated;.   
7500: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65   pNewItem->zInde
7510: 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  x = sqlite3DbStr
7520: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7530: 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70  ->zIndex);.    p
7540: 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65  NewItem->notInde
7550: 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xed = pOldItem->
7560: 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20  notIndexed;.    
7570: 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pNewItem->pIndex
7580: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e   = pOldItem->pIn
7590: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  dex;.    pTab = 
75a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d  pNewItem->pTab =
75b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b   pOldItem->pTab;
75c0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
75d0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
75e0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
75f0: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
7600: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7610: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7620: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
7630: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7640: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
7650: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
7660: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
7670: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7680: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
7690: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
76a0: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
76b0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
76c0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
76d0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
76e0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
76f0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
7700: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
7710: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
7720: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
7730: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
7740: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
7750: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7760: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
7770: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
7780: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7790: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
77a0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d  New->nId = pNew-
77b0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64  >nAlloc = p->nId
77c0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
77d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
77e0: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
77f0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
7800: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
7810: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
7820: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
7830: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7840: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
7850: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
7860: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
7870: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
7880: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
7890: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
78a0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
78b0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
78c0: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
78d0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
78e0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
78f0: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
7900: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
7910: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
7920: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
7930: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
7940: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
7950: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
7960: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
7970: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28  ect *pNew;.  if(
7980: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
7990: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
79a0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
79b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
79c0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
79d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
79e0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
79f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7a00: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
7a10: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  gs);.  pNew->pSr
7a20: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
7a30: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
7a40: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  c, flags);.  pNe
7a50: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
7a60: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7a70: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
7a80: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
7a90: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7aa0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7ab0: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
7ac0: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
7ad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7ae0: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
7af0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7b00: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
7b10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7b20: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
7b30: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7b40: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
7b50: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
7b60: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
7b70: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
7b80: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ags);.  pNew->pL
7b90: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
7ba0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
7bb0: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
7bc0: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
7bd0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7be0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
7bf0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
7c00: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
7c10: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
7c20: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
7c30: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
7c40: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
7c50: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  l;.  pNew->pRigh
7c60: 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65  tmost = 0;.  pNe
7c70: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
7c80: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
7c90: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
7ca0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
7cb0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
7cc0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e   -1;.  return pN
7cd0: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
7ce0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
7cf0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
7d00: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
7d10: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
7d20: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
7d30: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
7d40: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
7d50: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
7d60: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
7d70: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
7d80: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
7d90: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
7da0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
7db0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
7dc0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
7dd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7de0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
7df0: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
7e00: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
7e10: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
7e20: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
7e30: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
7e40: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
7e50: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
7e60: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
7e70: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
7e80: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
7e90: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
7ea0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7eb0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
7ec0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7ed0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
7ee0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
7ef0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
7f00: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
7f10: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
7f20: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
7f30: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
7f40: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
7f50: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
7f60: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
7f70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7f80: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
7f90: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
7fa0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7fb0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
7fc0: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
7fd0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
7fe0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
7ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
8000: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
8010: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
8020: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
8030: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
8040: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8050: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
8060: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e   int n = pList->
8070: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20  nAlloc*2 + 4;.  
8080: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
8090: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
80a0: 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c  ->a, n*sizeof(pL
80b0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
80c0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
80d0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
80e0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
80f0: 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73  >a = a;.    pLis
8100: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  t->nAlloc = sqli
8110: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
8120: 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61 5b  db, a)/sizeof(a[
8130: 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0]);.  }.  asser
8140: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
8150: 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20  ;.  if( 1 ){.   
8160: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8170: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
8180: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
8190: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
81a0: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
81b0: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
81c0: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
81d0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
81e0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
81f0: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
8200: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
8210: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
8220: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
8230: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8240: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
8250: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8260: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
8270: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
8280: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8290: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61  ExprList.a[].zNa
82a0: 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  me element of th
82b0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
82c0: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
82d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
82e0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
82f0: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
8300: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
8310: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61   error.  But pNa
8320: 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  me should never 
8330: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
8340: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8350: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
8360: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8370: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
8380: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
8390: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
83a0: 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  etName(.  Parse 
83b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
83c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
83d0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
83e0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
83f0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
8400: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
8410: 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  an. */.  Token *
8420: 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
8430: 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61   /* Name to be a
8440: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  dded */.  int de
8450: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
8460: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75    /* True to cau
8470: 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62  se the name to b
8480: 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  e dequoted */.){
8490: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
84a0: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
84b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
84c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
84d0: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
84e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
84f0: 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
8500: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
8510: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20   );.    pItem = 
8520: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
8530: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
8540: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
8550: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  ame==0 );.    pI
8560: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
8570: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50  ite3DbStrNDup(pP
8580: 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d  arse->db, pName-
8590: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
85a0: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
85b0: 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
85c0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
85d0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
85e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
85f0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
8600: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
8610: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
8620: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
8630: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
8640: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8650: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
8660: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
8670: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
8680: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
8690: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
86a0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
86b0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
86c0: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
86d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
86e0: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
86f0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
8700: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
8710: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8720: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8730: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8740: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
8750: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
8760: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
8770: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70  e span. */.  Exp
8780: 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20  rSpan *pSpan    
8790: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e       /* The span
87a0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
87b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
87c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
87d0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
87e0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
87f0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
8800: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
8810: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8820: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
8830: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
8840: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
8850: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
8860: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
8870: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
8880: 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78  ed || pItem->pEx
8890: 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72  pr==pSpan->pExpr
88a0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
88b0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
88c0: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
88d0: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
88e0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
88f0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
8900: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
8930: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
8940: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
8950: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
8960: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
8970: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
8980: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
8990: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
89a0: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
89b0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
89c0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
89d0: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
89e0: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
89f0: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
8a00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
8a10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
8a20: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
8a30: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
8a40: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8a50: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
8a60: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
8a70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
8a80: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
8a90: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
8aa0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
8ab0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
8ac0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
8ad0: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
8ae0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8af0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
8b00: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
8b10: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
8b20: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
8b30: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
8b40: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
8b50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8b60: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
8b70: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
8b80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
8b90: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8ba0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
8bb0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
8bc0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
8bd0: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69  st->a!=0 || (pLi
8be0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20  st->nExpr==0 && 
8bf0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
8c00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8c10: 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69  List->nExpr<=pLi
8c20: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  st->nAlloc );.  
8c30: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
8c40: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
8c50: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
8c60: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
8c70: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
8c80: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
8c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8ca0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
8cb0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
8cc0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8cd0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  m->zSpan);.  }. 
8ce0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8cf0: 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
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 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
8d20: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
8d30: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
8d40: 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e  lbacks.  Walker.
8d50: 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65  u.pi is a pointe
8d60: 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67  r.** to an integ
8d70: 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  er.  These routi
8d80: 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67  nes are checking
8d90: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
8da0: 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69  o see.** if it i
8db0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53  s a constant.  S
8dc0: 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20  et *Walker.u.pi 
8dd0: 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72  to 0 if the expr
8de0: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74  ession is.** not
8df0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a   constant..**.**
8e00: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
8e10: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
8e20: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
8e30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
8e40: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
8e50: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a  xprIsConstant().
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 4e 6f 74 4a  prIsConstantNotJ
8e80: 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c  oin().**     sql
8e90: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8ea0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a  ntOrFunction().*
8eb0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
8ec0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
8ed0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
8ee0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
8ef0: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
8f00: 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65  er->u.i is 3 the
8f10: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
8f20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
8f30: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
8f40: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
8f50: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
8f60: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
8f70: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
8f80: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
8f90: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
8fa0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
8fb0: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26  alker->u.i==3 &&
8fc0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
8fd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
8fe0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
8ff0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
9000: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
9010: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
9020: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9030: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
9040: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
9050: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
9060: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
9070: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
9080: 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b      ** and pWalk
9090: 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20  er->u.i==2 */.  
90a0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
90b0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
90c0: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20  alker->u.i==2 ) 
90d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
90e0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
90f0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
9100: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
9110: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
9120: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
9130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
9140: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
9150: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9160: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
9170: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9180: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
9190: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
91a0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
91b0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
91c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
91d0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
91e0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
91f0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e       pWalker->u.
9200: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  i = 0;.      ret
9210: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9220: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
9230: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
9240: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
9250: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
9260: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
9270: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
9280: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9290: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
92a0: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
92b0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
92c0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
92d0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
92e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
92f0: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
9300: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
9310: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
9320: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
9330: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
9340: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
9350: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
9360: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
9370: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
9380: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
9390: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
93a0: 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72  tFlag){.  Walker
93b0: 20 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e   w;.  w.u.i = in
93c0: 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
93d0: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
93e0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
93f0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
9400: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
9410: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
9420: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
9430: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
9440: 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  .u.i;.}../*.** W
9450: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9460: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9470: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9480: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9490: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
94a0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
94b0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
94c0: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
94d0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
94e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
94f0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
9500: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
9510: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
9520: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
9530: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
9540: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
9550: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
9560: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
9570: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9580: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
9590: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
95a0: 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 1);.}../*.*
95b0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
95c0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
95d0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
95e0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
95f0: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
9600: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
9610: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
9620: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
9630: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
9640: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
9650: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
9660: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
9670: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
9680: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
9690: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
96a0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
96b0: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
96c0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
96d0: 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a  sConst(p, 3);.}.
96e0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
96f0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9700: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9710: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9720: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
9730: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
9740: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
9750: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
9760: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
9770: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
9780: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
9790: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
97a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
97b0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
97c0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
97d0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
97e0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
97f0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
9800: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
9810: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
9820: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
9830: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9840: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
9850: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
9860: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29  xprIsConst(p, 2)
9870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
9880: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
9890: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
98a0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
98b0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
98c0: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
98d0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
98e0: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
98f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
9900: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
9910: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
9920: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
9930: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
9940: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
9950: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
9960: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
9970: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
9980: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
9990: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
99a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
99b0: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
99c0: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
99d0: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
99e0: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
99f0: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
9a00: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
9a10: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
9a20: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
9a30: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
9a40: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
9a50: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
9a60: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
9a70: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
9a80: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
9a90: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
9aa0: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
9ab0: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
9ac0: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
9ad0: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
9ae0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
9af0: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
9b00: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
9b10: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
9b20: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
9b30: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
9b40: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
9b50: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9b60: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9b70: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
9b80: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
9b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9ba0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
9bb0: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
9bc0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
9bd0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
9be0: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
9bf0: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
9c00: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
9c10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9c30: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
9c40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9c60: 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20   FALSE if there 
9c70: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
9c80: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
9c90: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   can be NULL..**
9ca0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9cb0: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e  ssion might be N
9cc0: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78  ULL or if the ex
9cd0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20  pression is too 
9ce0: 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65  complex.** to te
9cf0: 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  ll return TRUE. 
9d00: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
9d10: 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20  tine is used as 
9d20: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
9d30: 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75   to skip OP_IsNu
9d40: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68  ll opcodes.** wh
9d50: 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  en we know that 
9d60: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
9d70: 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  e NULL.  Hence, 
9d80: 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
9d90: 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54  .** (returning T
9da0: 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74  RUE when in fact
9db0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9dc0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c  can never be NUL
9dd0: 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61  L) might.** be a
9de0: 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e   small performan
9df0: 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74  ce hit but is ot
9e00: 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73  herwise harmless
9e10: 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a  .  On the other.
9e20: 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65  ** hand, a false
9e30: 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72   negative (retur
9e40: 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20  ning FALSE when 
9e50: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64  the result could
9e60: 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c   be NULL).** wil
9e70: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
9e80: 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  in an incorrect 
9e90: 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e  answer.  So when
9ea0: 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
9eb0: 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e  n.** TRUE..*/.in
9ec0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  t sqlite3ExprCan
9ed0: 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70  BeNull(const Exp
9ee0: 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a  r *p){.  u8 op;.
9ef0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
9f00: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
9f10: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
9f20: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
9f30: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
9f40: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
9f50: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
9f60: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
9f70: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9f80: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
9f90: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
9fa0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
9fb0: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
9fc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
9fd0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
9fe0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9ff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
a000: 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c  ate an OP_IsNull
a010: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
a020: 74 20 74 65 73 74 73 20 72 65 67 69 73 74 65 72  t tests register
a030: 20 69 52 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a   iReg and jumps.
a040: 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ** to location i
a050: 44 65 73 74 20 69 66 20 74 68 65 20 76 61 6c 75  Dest if the valu
a060: 65 20 69 6e 20 69 52 65 67 20 69 73 20 4e 55 4c  e in iReg is NUL
a070: 4c 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 6e  L.  The value in
a080: 20 69 52 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f   iReg .** was co
a090: 6d 70 75 74 65 64 20 62 79 20 70 45 78 70 72 2e  mputed by pExpr.
a0a0: 20 20 49 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b    If we can look
a0b0: 20 61 74 20 70 45 78 70 72 20 61 74 20 63 6f 6d   at pExpr at com
a0c0: 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a  pile-time and.**
a0d0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61 74 20   determine that 
a0e0: 69 74 20 63 61 6e 20 6e 65 76 65 72 20 67 65 6e  it can never gen
a0f0: 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68  erate a NULL, th
a100: 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c  en the OP_IsNull
a110: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61   operation.** ca
a120: 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  n be omitted..*/
a130: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
a140: 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
a150: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
a160: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
a170: 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
a180: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
a190: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 2f   Expr *pExpr,  /
a1a0: 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * Only generate 
a1b0: 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20 74 68 69  OP_IsNull if thi
a1c0: 73 20 65 78 70 72 20 63 61 6e 20 62 65 20 4e 55  s expr can be NU
a1d0: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  LL */.  int iReg
a1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
a1f0: 65 73 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  est the value in
a200: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 66   this register f
a210: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
a220: 20 69 44 65 73 74 20 20 20 20 20 20 20 20 20 20   iDest          
a230: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
a240: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75   the value is nu
a250: 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73  ll */.){.  if( s
a260: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
a270: 75 6c 6c 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ull(pExpr) ){.  
a280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a290: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
a2a0: 2c 20 69 52 65 67 2c 20 69 44 65 73 74 29 3b 0a  , iReg, iDest);.
a2b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
a2c0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
a2d0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
a2e0: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
a2f0: 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
a300: 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
a310: 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
a320: 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
a330: 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
a340: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
a350: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a360: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a370: 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
a380: 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
a390: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
a3a0: 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
a3b0: 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
a3c0: 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
a3d0: 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
a3e0: 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
a3f0: 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
a400: 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
a410: 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
a420: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
a430: 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
a440: 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
a450: 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
a460: 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
a470: 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  if( aff==SQLITE_
a480: 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  AFF_NONE ) retur
a490: 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  n 1;.  while( p-
a4a0: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
a4b0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
a4c0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
a4d0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
a4e0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
a4f0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
a500: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
a510: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
a520: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
a530: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
a540: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
a550: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
a560: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
a570: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a580: 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
a590: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
a5a0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20  ITE_AFF_REAL || 
a5b0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
a5c0: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
a5d0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
a5e0: 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  G: {.      retur
a5f0: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
a600: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  F_TEXT;.    }.  
a610: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
a620: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
a630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a640: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
a650: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
a660: 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
a670: 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
a680: 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
a690: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
a6a0: 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
a6b0: 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
a6c0: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
a6d0: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
a6e0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a6f0: 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
a700: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
a710: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a720: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
a730: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
a740: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
a750: 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
a760: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
a770: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
a780: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
a790: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
a7a0: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
a7b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a7c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a7d0: 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
a7e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a7f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a800: 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
a810: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
a820: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
a830: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
a840: 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
a850: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
a860: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
a870: 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74   a.** query of t
a880: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
a890: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
a8a0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72   ...).**.** Wher
a8b0: 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  e the SELECT... 
a8c0: 63 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65  clause is as spe
a8d0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61  cified by the pa
a8e0: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a  rameter to this.
a8f0: 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ** routine..**.*
a900: 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  * The Select obj
a910: 65 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61  ect passed in ha
a920: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
a930: 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20  reprocessed and 
a940: 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76  no.** errors hav
a950: 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f  e been found..*/
a960: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a970: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74  OMIT_SUBQUERY.st
a980: 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69  atic int isCandi
a990: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c  dateForInOpt(Sel
a9a0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
a9b0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72  st *pSrc;.  Expr
a9c0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
a9d0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
a9e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
a9f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
aa00: 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68        /* right-h
aa10: 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69  and side of IN i
aa20: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  s SELECT */.  if
aa30: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
aa40: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
aa50: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
aa60: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
aa70: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
aa80: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
aa90: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
aaa0: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
aab0: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
aac0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
aad0: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
aae0: 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
aaf0: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
ab00: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
ab10: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
ab20: 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
ab30: 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
ab40: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
ab50: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
ab60: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
ab70: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
ab80: 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
ab90: 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
aba0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
abb0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
abc0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
abd0: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
abf0: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
ac00: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
ac10: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac30: 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73  * No LIMIT means
ac40: 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20   no OFFSET */.  
ac50: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
ac60: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ac70: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
ac80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
ac90: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
aca0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
acb0: 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
acc0: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
acd0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
ace0: 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
acf0: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
ad00: 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
ad10: 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
ad20: 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
ad30: 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
ad40: 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
ad50: 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
ad60: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20  [0].pTab;.  if( 
ad70: 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29  NEVER(pTab==0) )
ad80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
ad90: 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
ada0: 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
adb0: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
adc0: 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
add0: 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
ade0: 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
adf0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
ae00: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
ae10: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
ae20: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
ae30: 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
ae40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
ae50: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
ae60: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
ae70: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
ae80: 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73  t */.  if( pELis
ae90: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
aea0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
aeb0: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75  eturn 0; /* Resu
aec0: 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a  lt is a column *
aed0: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
aee0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
aef0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
af00: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
af10: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
af20: 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74  tion and allocat
af30: 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 73 20  e space for its 
af40: 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65  flag. Return the
af50: 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20   .** address of 
af60: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
af70: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
af80: 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73  te3CodeOnce(Pars
af90: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
afa0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
afb0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
afc0: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
afd0: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
afe0: 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ded */.  return 
aff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b000: 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50  1(v, OP_Once, pP
b010: 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a  arse->nOnce++);.
b020: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b030: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
b040: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
b050: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
b060: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
b070: 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20 74 6f  * It's job is to
b080: 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
b090: 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
b0a0: 72 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  re that may be u
b0b0: 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f  sed.** either to
b0c0: 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
b0d0: 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e  ship of the (...
b0e0: 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  ) set or to iter
b0f0: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69  ate through.** i
b100: 74 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70  ts members, skip
b110: 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
b120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
b130: 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 6f   of the cursor o
b140: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
b150: 72 65 65 20 28 64 61 74 61 62 61 73 65 20 74 61  ree (database ta
b160: 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e  ble, database in
b170: 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72  dex .** or epher
b180: 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74  mal table) is st
b190: 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62  ored in pX->iTab
b1a0: 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
b1b0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
b1c0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
b1d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
b1e0: 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
b1f0: 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
b200: 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
b210: 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
b220: 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72 73  ROWID - The curs
b230: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
b240: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
b250: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
b260: 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72  _INDEX - The cur
b270: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
b280: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 64  n a database ind
b290: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
b2a0: 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63 75  X_EPH -   The cu
b2b0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
b2c0: 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
b2d0: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72   populated epher
b300: 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  emal table..**.*
b310: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
b320: 74 72 65 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tree may only be
b330: 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c   used if the SEL
b340: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69  ECT is of the si
b350: 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a  mple.** form:.**
b360: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
b370: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
b380: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
b390: 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  e prNotFound par
b3a0: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
b3b0: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  n the b-tree wil
b3c0: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
b3d0: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
b3e0: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c  the set members,
b3f0: 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75   skipping any du
b400: 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69  plicates. In thi
b410: 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68  s case an.** eph
b420: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
b430: 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  t be used unless
b440: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63   the selected <c
b450: 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e  olumn> is guaran
b460: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
b470: 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
b480: 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
b490: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b4a0: 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20  EY or it.** has 
b4b0: 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
b4c0: 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e  int or UNIQUE in
b4d0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  dex..**.** If th
b4e0: 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  e prNotFound par
b4f0: 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
b500: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
b510: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
b520: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
b530: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e  embership tests.
b540: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
b550: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
b560: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
b570: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
b580: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
b590: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
b5a0: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
b5b0: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
b5c0: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
b5d0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
b5e0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
b5f0: 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
b600: 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
b610: 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
b620: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
b630: 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20  * needs to know 
b640: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b650: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  he structure con
b660: 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c  tains an SQL NUL
b670: 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f  L .** value in o
b680: 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c  rder to correctl
b690: 79 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  y evaluate expre
b6a0: 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49  ssions like "X I
b6b0: 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66  N (Y, Z)"..** If
b6c0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
b6d0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
b6e0: 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
b6f0: 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
b700: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
b710: 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
b720: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
b730: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
b740: 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
b750: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66   *prNotFound. If
b760: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
b770: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
b780: 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  .) contains a.**
b790: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
b7a0: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73  n *prNotFound is
b7b0: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
b7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
b7d0: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
b7e0: 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
b7f0: 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
b800: 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a  NotFound, then.*
b810: 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61  * its initial va
b820: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  lue is NULL.  If
b830: 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20   the (...) does 
b840: 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74  not remain const
b850: 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  ant.** for the d
b860: 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71  uration of the q
b870: 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53  uery (i.e. the S
b880: 45 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68 65  ELECT within the
b890: 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63   (...).** is a c
b8a0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
b8b0: 72 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ry) then the val
b8c0: 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ue of the alloca
b8d0: 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a  ted register is.
b8e0: 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  ** reset to NULL
b8f0: 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 73   each time the s
b900: 75 62 71 75 65 72 79 20 69 73 20 72 65 72 75 6e  ubquery is rerun
b910: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
b920: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75  e.** caller to u
b930: 73 65 20 76 64 62 65 20 63 6f 64 65 20 65 71 75  se vdbe code equ
b940: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66  ivalent to the f
b950: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
b960: 20 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d    if( register==
b970: 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68  NULL ){.**     h
b980: 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20  as_null = <test 
b990: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
b9a0: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
b9b0: 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72  .**     register
b9c0: 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a   = 1.**   }.**.*
b9d0: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  * in order to av
b9e0: 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  oid running the 
b9f0: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
ba00: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
ba10: 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d   null>.** test m
ba20: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69  ore often than i
ba30: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  s necessary..*/.
ba40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ba50: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
ba60: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
ba70: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
ba80: 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74  e, Expr *pX, int
ba90: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20   *prNotFound){. 
baa0: 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
bad0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
bae0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
baf0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
bb20: 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
bb30: 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
bb40: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
bb50: 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
bb60: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
bb70: 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
bb80: 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
bb90: 69 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75  ique = (prNotFou
bba0: 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75  nd==0);   /* Tru
bbb0: 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
bbc0: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62   unique */.  Vdb
bbd0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bbe0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
bbf0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
bc00: 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
bc10: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
bc20: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
bc30: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
bc40: 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
bc50: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
bc60: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
bc70: 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
bc80: 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
bc90: 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
bca0: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
bcb0: 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
bcc0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70   table..  */.  p
bcd0: 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65   = (ExprHasPrope
bce0: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
bcf0: 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53  lect) ? pX->x.pS
bd00: 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66  elect : 0);.  if
bd10: 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d  ( ALWAYS(pParse-
bd20: 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43  >nErr==0) && isC
bd30: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
bd40: 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (p) ){.    sqlit
bd50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bd60: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
bd70: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
bd80: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
bd90: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
bdc0: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
bdd0: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
be00: 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  sion <column> */
be10: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  .    int iCol;  
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
be40: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c  ndex of column <
be50: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69  column> */.    i
be60: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
be90: 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a  e idx for pTab *
bea0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
beb0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
bec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
bed0: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
bee0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
bef0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
bf00: 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ->pEList!=0 );  
bf10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
bf20: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
bf30: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
bf40: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
bf50: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
bf60: 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65  Expr!=0 ); /* Be
bf70: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
bf80: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
bf90: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
bfa0: 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20  ->pSrc!=0 );    
bfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
bfc0: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
bfd0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
bfe0: 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d  */.    pTab = p-
bff0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
c000: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 2d  ;.    pExpr = p-
c010: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
c020: 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  xpr;.    iCol = 
c030: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
c040: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
c050: 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  an OP_VerifyCook
c060: 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  ie and OP_TableL
c070: 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
c080: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
c090: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c0a0: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
c0b0: 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
c0c0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
c0d0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
c0e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
c0f0: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
c100: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
c110: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
c120: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
c130: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
c140: 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c  lled from two pl
c150: 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61  aces. In both ca
c160: 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20  ses the vdbe.   
c170: 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
c180: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
c190: 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65  So assume sqlite
c1a0: 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c  3GetVdbe() is al
c1b0: 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63  ways.    ** succ
c1c0: 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20  essful here..   
c1d0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76   */.    assert(v
c1e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  );.    if( iCol<
c1f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
c200: 41 64 64 72 3b 0a 0a 20 20 20 20 20 20 69 41 64  Addr;..      iAd
c210: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
c220: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
c230: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
c240: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
c250: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
c260: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
c270: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
c280: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
c290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c2a0: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
c2b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c2c0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
c2f0: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
c300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
c310: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c320: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
c330: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
c340: 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20  dex is to.      
c350: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
c360: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
c370: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
c380: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
c390: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
c3a0: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
c3b0: 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  uence.  */.     
c3c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
c3d0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
c3e0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
c3f0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
c400: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
c410: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
c420: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
c430: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
c440: 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20  erform the .    
c450: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
c460: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
c470: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
c480: 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20  he column. If.  
c490: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
c4a0: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
c4b0: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20  ible to use any 
c4c0: 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  index..      */.
c4d0: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d        char aff =
c4e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
c4f0: 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69  ity(pX);.      i
c500: 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
c510: 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   (pTab->aCol[iCo
c520: 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66  l].affinity==aff
c530: 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ||aff==SQLITE_AF
c540: 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20  F_NONE);..      
c550: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
c560: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
c570: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
c580: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
c590: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
c5a0: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
c5b0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
c5c0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
c5d0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
c5e0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64  db, ENC(db), pId
c5f0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29  x->azColl[0], 0)
c600: 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20 20  ==pReq.         
c610: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
c620: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
c630: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
c640: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
c650: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
c660: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
c670: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  r;.          cha
c680: 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20  r *pKey;.  .    
c690: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68        pKey = (ch
c6a0: 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65  ar *)sqlite3Inde
c6b0: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
c6c0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
c6d0: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
c6e0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
c6f0: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
c700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c710: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
c720: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
c730: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
c760: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
c770: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
c780: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
c790: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
c7b0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
c7c0: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
c7d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c7e0: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
c7f0: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
c800: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
c810: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
c820: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
c830: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
c840: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
c850: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c860: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c870: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72   OP_Null, 0, *pr
c880: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20  NotFound);.     
c890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
c8a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c8b0: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
c8c0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
c8d0: 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20  ld not found an 
c8e0: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
c8f0: 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
c900: 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
c910: 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
c920: 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
c930: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
c940: 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
c950: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ob..    */.    d
c960: 6f 75 62 6c 65 20 73 61 76 65 64 4e 51 75 65 72  ouble savedNQuer
c970: 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
c980: 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
c990: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
c9a0: 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
c9b0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
c9c0: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
c9d0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e  nd ){.      *prN
c9e0: 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61  otFound = rMayHa
c9f0: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
ca00: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
ca10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ca20: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ca30: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  *prNotFound);.  
ca40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
ca50: 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
ca60: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75  >nQueryLoop>(dou
ca70: 62 6c 65 29 31 20 29 3b 0a 20 20 20 20 20 20 70  ble)1 );.      p
ca80: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
ca90: 70 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  p = (double)1;. 
caa0: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
cab0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
cac0: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
cad0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
cae0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
caf0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
cb00: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
cb10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
cb20: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
cb30: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
cb40: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
cb50: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
cb60: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
cb70: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
cb80: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
cb90: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
cba0: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
cbb0: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
cbc0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
cbd0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
cbe0: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
cbf0: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
cc00: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
cc10: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
cc20: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
cc30: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
cc40: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
cc50: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
cc60: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
cc70: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
cc80: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
cc90: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
cca0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
ccb0: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
ccc0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
ccd0: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
cce0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
ccf0: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
cd00: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
cd10: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
cd20: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
cd30: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
cd40: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
cd50: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
cd60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
cd70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
cd80: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
cd90: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
cda0: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
cdb0: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
cdc0: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
cdd0: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
cde0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
cdf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
ce00: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
ce10: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
ce20: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
ce30: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
ce40: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
ce50: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
ce60: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
ce70: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
ce80: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
ce90: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
cea0: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
ceb0: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
cec0: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
ced0: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
cee0: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
cef0: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
cf00: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
cf10: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
cf20: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
cf30: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
cf40: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
cf50: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
cf60: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
cf70: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
cf80: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
cf90: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
cfa0: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
cfb0: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
cfc0: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
cfd0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
cfe0: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
cff0: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
d000: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
d010: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
d020: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
d030: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
d040: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
d050: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
d060: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
d070: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
d080: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
d090: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
d0a0: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
d0b0: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
d0c0: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
d0d0: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
d0e0: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
d0f0: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
d100: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
d110: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
d120: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
d130: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
d140: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
d150: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
d160: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
d170: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
d180: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
d190: 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e  resense or absen
d1a0: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
d1b0: 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f  he RHS..**.** Fo
d1c0: 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
d1d0: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
d1e0: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
d1f0: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
d200: 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
d210: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
d220: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
d230: 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  curs, the return
d240: 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a   value is 0..*/.
d250: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d260: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
d270: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
d280: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
d290: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d2a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d2b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
d2c0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
d2d0: 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
d2e0: 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
d2f0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
d300: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20  rMayHaveNull,   
d310: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
d320: 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
d330: 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
d340: 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
d350: 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
d360: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
d370: 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
d380: 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
d390: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  /.){.  int testA
d3a0: 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ddr = -1;       
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3c0: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
d3d0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
d3e0: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
d410: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
d420: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
d430: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d440: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
d450: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
d460: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
d470: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
d480: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
d490: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
d4a0: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
d4b0: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
d4c0: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
d4d0: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
d4e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
d4f0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
d500: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
d510: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
d520: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
d530: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
d540: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
d550: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
d560: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
d570: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
d580: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
d590: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
d5a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
d5b0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
d5c0: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
d5d0: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
d5e0: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
d5f0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
d600: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
d610: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
d620: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
d630: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
d640: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
d650: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d660: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
d670: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
d680: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
d690: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69  pParse);.  }..#i
d6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d6b0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
d6c0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
d6d0: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
d6e0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
d6f0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
d700: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
d710: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
d720: 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e  Y %d", testAddr>
d730: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
d740: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
d750: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
d760: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
d770: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
d780: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
d790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d7a0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
d7b0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
d7c0: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
d7d0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
d7e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
d7f0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
d800: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
d810: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
d820: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
d830: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
d840: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
d850: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 4b 65  e IN */.      Ke
d860: 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 20 20  yInfo keyInfo;  
d870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
d880: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 67 65 6e  info for the gen
d890: 65 72 61 74 65 64 20 74 61 62 6c 65 20 2a 2f 0a  erated table */.
d8a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d8d0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d8e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
d8f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
d900: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
d910: 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
d920: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
d930: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  */..      if( rM
d940: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
d950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d960: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
d970: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
d980: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
d990: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
d9a0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
d9b0: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
d9c0: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
d9d0: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
d9e0: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
d9f0: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
da00: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
da10: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
da20: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
da30: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
da40: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
da50: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
da60: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
da70: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
da80: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
da90: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
daa0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
dab0: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
dac0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
dad0: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
dae0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
daf0: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
db00: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
db10: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
db20: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
db30: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
db40: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
db50: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
db60: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
db70: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
db80: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
db90: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
dba0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
dbb0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
dbc0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
dbd0: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
dbe0: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
dbf0: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
dc00: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
dc10: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
dc20: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
dc30: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
dc40: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
dc50: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
dc60: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
dc70: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
dc80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
dc90: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
dca0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
dcb0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
dcc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
dcd0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
dce0: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
dcf0: 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
dd00: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
dd10: 75 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ull==0 ) sqlite3
dd20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
dd30: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
dd40: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
dd50: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
dd60: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
dd70: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
dd80: 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69  ld = 1;..      i
dd90: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
dda0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
ddb0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
ddc0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
ddd0: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
dde0: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
ddf0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
de00: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
de10: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
de20: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
de30: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
de40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
de50: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
de60: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
de70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
de80: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
de90: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
dea0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
deb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
dec0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
ded0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
dee0: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
def0: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
df00: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
df10: 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28  est.affinity = (
df20: 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  u8)affinity;.   
df30: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
df40: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
df50: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
df60: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
df70: 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65    pExpr->x.pSele
df80: 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
df90: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
dfa0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
dfb0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
dfc0: 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
dfd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
dfe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dff0: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
e000: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
e010: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  EList;.        i
e020: 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74  f( ALWAYS(pEList
e030: 21 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  !=0 && pEList->n
e040: 45 78 70 72 3e 30 29 20 29 7b 20 0a 20 20 20 20  Expr>0) ){ .    
e050: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
e060: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
e070: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
e080: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
e090: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
e0a0: 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d           pEList-
e0b0: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
e0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e0d0: 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
e0e0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
e0f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
e100: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
e110: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
e120: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
e130: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
e140: 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
e150: 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
e160: 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
e170: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
e180: 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
e190: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
e1a0: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
e1b0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
e1c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
e1d0: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
e1e0: 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
e1f0: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
e200: 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
e210: 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
e220: 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
e230: 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
e240: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
e250: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
e260: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
e270: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
e280: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
e290: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
e2a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
e2b0: 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20   r2, r3;..      
e2c0: 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
e2d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
e2e0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
e2f0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
e300: 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e   }.        keyIn
e310: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  fo.aColl[0] = sq
e320: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e330: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e340: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20  pLeft);..       
e350: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
e360: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
e370: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
e380: 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
e390: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
e3a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
e3b0: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
e3c0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
e3d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e3e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e3f0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
e400: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
e410: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
e420: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
e430: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
e440: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
e450: 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
e460: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
e470: 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
e480: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
e490: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e4a0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
e4b0: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
e4c0: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
e4d0: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
e4e0: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
e4f0: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
e500: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
e510: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
e520: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
e530: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
e540: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
e550: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
e560: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
e570: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
e580: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
e590: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
e5a0: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
e5b0: 64 72 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  dr>=0 && !sqlite
e5c0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e5d0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
e5e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e5f0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74  hangeToNoop(v, t
e600: 65 73 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  estAddr);.      
e610: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
e620: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
e630: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
e640: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
e650: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
e660: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
e670: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
e680: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
e690: 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
e6a0: 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
e6b0: 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
e6c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e6d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e6e0: 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
e6f0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
e700: 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
e710: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e720: 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
e730: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
e740: 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
e750: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
e760: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
e770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
e780: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e790: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
e7a0: 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e7d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e7e0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
e7f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e800: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
e810: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
e820: 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
e830: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e840: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e850: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e860: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
e870: 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
e880: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
e890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
e8a0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
e8b0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33  hange(pParse, r3
e8c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
e8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e8e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
e8f0: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
e900: 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  able, r2);.     
e910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e920: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
e930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
e940: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
e950: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
e960: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
e970: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
e980: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
e990: 20 20 20 69 66 28 20 21 69 73 52 6f 77 69 64 20     if( !isRowid 
e9a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e9b0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
e9c0: 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
e9d0: 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  &keyInfo, P4_KEY
e9e0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
e9f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea00: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  }..    case TK_E
ea10: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
ea20: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64  TK_SELECT:.    d
ea30: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ea40: 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74  /* If this has t
ea50: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
ea60: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
ea70: 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
ea80: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
ea90: 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
eaa0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
eab0: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
eac0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
ead0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
eae0: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66   in iColumn.  If
eaf0: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
eb00: 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  TS, write.      
eb10: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20  ** an integer 0 
eb20: 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20  (not exists) or 
eb30: 31 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20  1 (exists) into 
eb40: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20  a memory cell.  
eb50: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72      ** and recor
eb60: 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  d that memory ce
eb70: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
eb80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
eb90: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
ebc0: 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
ebd0: 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
ebe0: 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
ec10: 77 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75  with SELECt resu
ec20: 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  lt */..      tes
ec30: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
ec40: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
ec50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ec60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
ec70: 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
ec80: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
ec90: 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
eca0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
ecb0: 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  T );..      asse
ecc0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
ecd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
ece0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
ecf0: 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
ed00: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
ed10: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ed20: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
ed30: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29   ++pParse->nMem)
ed40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
ed50: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
ed60: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
ed70: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
ed80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ed90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eda0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
edb0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iParm);.        
edc0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
edd0: 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
ede0: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
edf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
ee00: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
ee10: 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
ee20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee30: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ee40: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
ee50: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
ee60: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
ee70: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
ee80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ee90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
eea0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
eeb0: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
eec0: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
eed0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
eee0: 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
eef0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
ef20: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
ef30: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
ef40: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  mit = 0;.      i
ef50: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
ef60: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
ef70: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
ef80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
ef90: 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
efa0: 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20  dest.iParm;.    
efb0: 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63    ExprSetIrreduc
efc0: 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20  ible(pExpr);.   
efd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
efe0: 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41    }..  if( testA
eff0: 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  ddr>=0 ){.    sq
f000: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f010: 65 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a  e(v, testAddr);.
f020: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
f030: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
f040: 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , 1);..  return 
f050: 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rReg;.}.#endif /
f060: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
f070: 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
f080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f090: 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
f0a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
f0b0: 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
f0c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
f0d0: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
f0e0: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
f0f0: 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
f100: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
f110: 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
f120: 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  s a scalar expre
f130: 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68  ssion.  The righ
f140: 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
f150: 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79  ).** is an array
f160: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
f170: 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78   values.  The ex
f180: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
f190: 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a   if the LHS is.*
f1a0: 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
f1b0: 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65  in the RHS.  The
f1c0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78   value of the ex
f1d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e  pression is unkn
f1e0: 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66  own (NULL).** if
f1f0: 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c   the LHS is NULL
f200: 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69   or if the LHS i
f210: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
f220: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61  within the RHS a
f230: 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f  nd the.** RHS co
f240: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
f250: 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  re NULL values..
f260: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f270: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
f280: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64  e will jump to d
f290: 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
f2a0: 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
f2b0: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
f2c0: 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
f2d0: 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
f2e0: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
f2f0: 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
f300: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
f310: 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
f320: 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
f330: 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
f340: 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
f350: 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
f360: 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  all through..*/.
f370: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
f380: 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
f390: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f3a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
f3b0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
f3c0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
f3d0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
f3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f3f0: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
f400: 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
f410: 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
f420: 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
f430: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
f440: 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
f450: 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
f460: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
f470: 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
f480: 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
f490: 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
f4a0: 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
f4b0: 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
f4c0: 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
f4d0: 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
f4e0: 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
f4f0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
f500: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
f510: 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f  ison affinity to
f520: 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54   use */.  int eT
f530: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
f540: 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
f550: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20  HS */.  int r1; 
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f570: 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
f580: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62  egister */.  Vdb
f590: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
f5a0: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
f5b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
f5c0: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  on */..  /* Comp
f5d0: 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41  ute the RHS.   A
f5e0: 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
f5f0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
f600: 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72  ursor.  ** pExpr
f610: 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f  ->iTable will co
f620: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
f630: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
f640: 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76  he RHS..  */.  v
f650: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f660: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
f670: 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d   );       /* OOM
f680: 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20   detected prior 
f690: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
f6a0: 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
f6b0: 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
f6c0: 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54  IN expr"));.  eT
f6d0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
f6e0: 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
f6f0: 20 70 45 78 70 72 2c 20 26 72 52 68 73 48 61 73   pExpr, &rRhsHas
f700: 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  Null);..  /* Fig
f710: 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
f720: 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
f730: 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
f740: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
f750: 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
f760: 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
f770: 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
f780: 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
f790: 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20   for.  ** P4 of 
f7a0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
f7b0: 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d   */.  affinity =
f7c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
f7d0: 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f  ity(pExpr);..  /
f7e0: 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
f7f0: 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
f800: 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
f810: 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  "..  */.  sqlite
f820: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
f830: 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73  Parse);.  r1 = s
f840: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f850: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
f860: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
f870: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f880: 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  , r1);..  /* If 
f890: 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c  the LHS is NULL,
f8a0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
f8b0: 20 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65   is either false
f8c0: 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69   or NULL dependi
f8d0: 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68  ng.  ** on wheth
f8e0: 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d  er the RHS is em
f8f0: 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70  pty or not, resp
f900: 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ectively..  */. 
f910: 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
f920: 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
f930: 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20      /* Shortcut 
f940: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
f950: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61  ase where the fa
f960: 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74  lse and NULL out
f970: 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a  comes are.    **
f980: 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
f990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f9a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
f9b0: 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c  , r1, destIfNull
f9c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f9d0: 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
f9e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f9f0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29   OP_NotNull, r1)
fa00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fa10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
fa20: 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  wind, pExpr->iTa
fa30: 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
fa40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fa50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
fa60: 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75  oto, 0, destIfNu
fa70: 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
fa80: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fa90: 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 69  addr1);.  }..  i
faa0: 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
fab0: 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
fac0: 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
fad0: 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
fae0: 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
faf0: 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20 20  -tree.    */.   
fb00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb10: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
fb20: 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  nt, r1, destIfFa
fb30: 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lse);.    sqlite
fb40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fb50: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78  P_NotExists, pEx
fb60: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
fb70: 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20  IfFalse, r1);.  
fb80: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
fb90: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
fba0: 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
fbb0: 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  b-tree..    */. 
fbc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbd0: 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
fbe0: 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26  ity, r1, 1, 0, &
fbf0: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20  affinity, 1);.. 
fc00: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74     /* If the set
fc10: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
fc20: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
fc30: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a   result of the .
fc40: 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e      ** "x IN (..
fc50: 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .)" expression m
fc60: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20  ust be either 0 
fc70: 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  or NULL. If the 
fc80: 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  set.    ** conta
fc90: 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75  ins no NULL valu
fca0: 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
fcb0: 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68 65  ult is 0. If the
fcc0: 20 73 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e   set .    ** con
fcd0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
fce0: 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  e NULL values, t
fcf0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
fd00: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70  f the.    ** exp
fd10: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
fd20: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
fd30: 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
fd40: 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66 46 61 6c  ==0 || destIfFal
fd50: 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
fd60: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
fd70: 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69  branch runs if i
fd80: 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f  t is known at co
fd90: 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20  mpile time that 
fda0: 74 68 65 20 52 48 53 0a 20 20 20 20 20 20 2a 2a  the RHS.      **
fdb0: 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   cannot contain 
fdc0: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69  NULL values. Thi
fdd0: 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68 65  s happens as the
fde0: 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
fdf0: 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22   of a "NOT NULL"
fe00: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74   constraint in t
fe10: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
fe20: 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ma..      **.   
fe30: 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74     ** Also run t
fe40: 68 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55  his branch if NU
fe50: 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  LL is equivalent
fe60: 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20   to FALSE.      
fe70: 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72 74  ** for this part
fe80: 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74  icular IN operat
fe90: 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  or..      */.   
fea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
feb0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
fec0: 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
fed0: 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
fee0: 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20  se, r1, 1);..   
fef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
ff00: 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c   In this branch,
ff10: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
ff20: 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  IN might contain
ff30: 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20   a NULL and.    
ff40: 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63    ** the presenc
ff50: 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74  e of a NULL on t
ff60: 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64  he RHS makes a d
ff70: 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
ff80: 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d  .      ** outcom
ff90: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ffa0: 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33    int j1, j2, j3
ffb0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;..      /* Firs
ffc0: 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  t check to see i
ffd0: 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
ffe0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
fff0: 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  S.  If so,.     
10000 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65   ** then the pre
10010 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69  sence of NULLs i
10020 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e  n the RHS does n
10030 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75  ot matter, so ju
10040 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  mp.      ** over
10050 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
10060 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20   that follows.. 
10070 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31       */.      j1
10080 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10090 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
100a0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
100b0 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 0a  le, 0, r1, 1);..
100c0 20 20 20 20 20 20 2f 2a 20 48 65 72 65 20 77 65        /* Here we
100d0 20 62 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   begin generatin
100e0 67 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  g code that runs
100f0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
10100 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  ot.      ** cont
10110 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
10120 20 52 48 53 2e 20 20 47 65 6e 65 72 61 74 65 20   RHS.  Generate 
10130 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65 20  additional code 
10140 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 65  that.      ** te
10150 73 74 73 20 74 68 65 20 52 48 53 20 66 6f 72 20  sts the RHS for 
10160 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68 65 20 52  NULLs.  If the R
10170 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  HS contains a NU
10180 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  LL then.      **
10190 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
101a0 75 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20 61  ull.  If there a
101b0 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20 74  re no NULLs in t
101c0 68 65 20 52 48 53 20 74 68 65 6e 0a 20 20 20 20  he RHS then.    
101d0 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73    ** jump to des
101e0 74 49 66 46 61 6c 73 65 2e 0a 20 20 20 20 20 20  tIfFalse..      
101f0 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71  */.      j2 = sq
10200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10210 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
10220 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
10230 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56     j3 = sqlite3V
10240 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10250 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
10260 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 52 68 73  >iTable, 0, rRhs
10270 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20  HasNull, 1);.   
10280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10290 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
102a0 65 72 2c 20 2d 31 2c 20 72 52 68 73 48 61 73 4e  er, -1, rRhsHasN
102b0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
102c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
102d0 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 73 71  v, j3);.      sq
102e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
102f0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 52  v, OP_AddImm, rR
10300 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20  hsHasNull, 1);. 
10310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10320 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b  JumpHere(v, j2);
10330 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
10340 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
10350 74 65 20 74 61 72 67 65 74 20 64 65 70 65 6e 64  te target depend
10360 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
10370 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74  r not.      ** t
10380 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  he RHS contains 
10390 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2f 0a  a NULL.      */.
103a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
103b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
103c0 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64  , rRhsHasNull, d
103d0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
103e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
103f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
10400 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
10410 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  ..      /* The O
10420 50 5f 46 6f 75 6e 64 20 61 74 20 74 68 65 20 74  P_Found at the t
10430 6f 70 20 6f 66 20 74 68 69 73 20 62 72 61 6e 63  op of this branc
10440 68 20 6a 75 6d 70 73 20 68 65 72 65 20 77 68 65  h jumps here whe
10450 6e 20 74 72 75 65 2c 20 0a 20 20 20 20 20 20 2a  n true, .      *
10460 2a 20 63 61 75 73 69 6e 67 20 74 68 65 20 6f 76  * causing the ov
10470 65 72 61 6c 6c 20 49 4e 20 65 78 70 72 65 73 73  erall IN express
10480 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20 74  ion evaluation t
10490 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  o fall through..
104a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
104b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
104c0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 7d  re(v, j1);.    }
104d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
104e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
104f0 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  rse, r1);.  sqli
10500 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
10510 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 56 64  pParse, 1);.  Vd
10520 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
10530 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d  nd IN expr"));.}
10540 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10550 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
10560 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63  */../*.** Duplic
10570 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61  ate an 8-byte va
10580 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  lue.*/.static ch
10590 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64  ar *dup8bytes(Vd
105a0 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
105b0 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  r *in){.  char *
105c0 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  out = sqlite3DbM
105d0 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33  allocRaw(sqlite3
105e0 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20  VdbeDb(v), 8);. 
105f0 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
10600 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20  memcpy(out, in, 
10610 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  8);.  }.  return
10620 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   out;.}..#ifndef
10630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
10640 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
10650 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
10660 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
10670 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
10680 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
10690 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
106a0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
106b0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
106c0 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
106d0 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
106e0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
106f0 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
10700 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
10710 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
10720 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
10730 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
10740 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
10750 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
10760 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
10770 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
10780 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
10790 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
107a0 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
107b0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
107c0 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
107d0 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
107e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a  ;.    char *zV;.
107f0 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
10800 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
10810 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
10820 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
10830 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
10840 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b  3IsNaN(value) );
10850 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46   /* The new AtoF
10860 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e   never returns N
10870 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  aN */.    if( ne
10880 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65  gateFlag ) value
10890 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a   = -value;.    z
108a0 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
108b0 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
108c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
108d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61  AddOp4(v, OP_Rea
108e0 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  l, 0, iMem, 0, z
108f0 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  V, P4_REAL);.  }
10900 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
10910 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
10920 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
10930 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
10940 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
10950 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
10960 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
10970 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
10980 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
10990 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
109a0 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
109b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
109c0 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
109d0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
109e0 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
109f0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
10a00 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10a10 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
10a20 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
10a30 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
10a40 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
10a50 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
10a60 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
10a70 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
10a80 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
10a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10aa0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
10ab0 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
10ac0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
10ad0 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
10ae0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
10af0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
10b00 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
10b10 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
10b20 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75  3Atoi64(z, &valu
10b30 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
10b40 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
10b50 46 38 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  F8);.    if( c==
10b60 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65  0 || (c==2 && ne
10b70 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  gFlag) ){.      
10b80 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20  char *zV;.      
10b90 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76  if( negFlag ){ v
10ba0 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d  alue = c==2 ? SM
10bb0 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d  ALLEST_INT64 : -
10bc0 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a  value; }.      z
10bd0 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
10be0 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
10bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10c00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49  beAddOp4(v, OP_I
10c10 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
10c20 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b  , zV, P4_INT64);
10c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  .    }else{.#ifd
10c40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10c50 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
10c60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10c70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65  Msg(pParse, "ove
10c80 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20  rsized integer: 
10c90 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f  %s%s", negFlag ?
10ca0 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23   "-" : "", z);.#
10cb0 65 6c 73 65 0a 20 20 20 20 20 20 63 6f 64 65 52  else.      codeR
10cc0 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
10cd0 67 2c 20 69 4d 65 6d 29 3b 0a 23 65 6e 64 69 66  g, iMem);.#endif
10ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10cf0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68  .** Clear a cach
10d00 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  e entry..*/.stat
10d10 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74  ic void cacheEnt
10d20 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  ryClear(Parse *p
10d30 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43  Parse, struct yC
10d40 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69  olCache *p){.  i
10d50 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b  f( p->tempReg ){
10d60 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
10d70 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
10d80 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
10d90 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70  pReg) ){.      p
10da0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
10db0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
10dc0 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  ++] = p->iReg;. 
10dd0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70     }.    p->temp
10de0 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Reg = 0;.  }.}..
10df0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e  ./*.** Record in
10e00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
10e10 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75  e that a particu
10e20 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  lar column from 
10e30 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20  a.** particular 
10e40 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20  table is stored 
10e50 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
10e60 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  register..*/.voi
10e70 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
10e80 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70  heStore(Parse *p
10e90 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c  Parse, int iTab,
10ea0 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69   int iCol, int i
10eb0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
10ec0 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69   int minLru;.  i
10ed0 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72  nt idxLru;.  str
10ee0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
10ef0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  ;..  assert( iRe
10f00 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67 69 73  g>0 );  /* Regis
10f10 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
10f20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 20  always positive 
10f30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  */.  assert( iCo
10f40 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
10f50 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
10f60 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
10f70 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51   */..  /* The SQ
10f80 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
10f90 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74   flag disables t
10fa0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
10fb0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20    This is used. 
10fc0 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20   ** for testing 
10fd0 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79  only - to verify
10fe0 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77   that SQLite alw
10ff0 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d  ays gets the sam
11000 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69  e answer.  ** wi
11010 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74  th and without t
11020 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
11030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
11040 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
11050 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
11060 68 65 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  he ) return;..  
11070 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
11080 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
11090 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
110a0 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
110b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
110c0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
110d0 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
110e0 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
110f0 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
11100 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
11110 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
11120 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
11130 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
11140 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
11150 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11160 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11170 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11180 2c 20 70 2b 2b 29 7b 0a 23 69 66 20 30 20 2f 2a  , p++){.#if 0 /*
11190 20 54 68 69 73 20 63 6f 64 65 20 77 6f 6c 64 20   This code wold 
111a0 72 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72 79  remove the entry
111b0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
111c0 69 66 20 69 74 20 65 78 69 73 74 65 64 20 2a 2f  if it existed */
111d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
111e0 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
111f0 54 61 62 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  Tab && p->iColum
11200 6e 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20  n==iCol ){.     
11210 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
11220 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
11230 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
11240 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
11250 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  el;.      p->iRe
11260 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
11270 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
11280 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
11290 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
112a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
112b0 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20  ert( p->iReg==0 
112c0 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  || p->iTable!=iT
112d0 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
112e0 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
112f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ndif..  /* Find 
11300 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e  an empty slot an
11310 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a  d replace it */.
11320 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
11330 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
11340 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
11350 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
11360 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
11370 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  =0 ){.      p->i
11380 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
11390 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
113a0 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
113b0 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43  Tab;.      p->iC
113c0 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
113d0 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
113e0 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d  eg;.      p->tem
113f0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  pReg = 0;.      
11400 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
11410 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
11420 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11430 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c  }.  }..  /* Repl
11440 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65 63  ace the last rec
11450 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20  ently used */.  
11460 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
11470 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20  fff;.  idxLru = 
11480 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  -1;.  for(i=0, p
11490 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
114a0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
114b0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
114c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c  +){.    if( p->l
114d0 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20  ru<minLru ){.   
114e0 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20     idxLru = i;. 
114f0 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d       minLru = p-
11500 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >lru;.    }.  }.
11510 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64 78    if( ALWAYS(idx
11520 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70  Lru>=0) ){.    p
11530 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
11540 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20  Cache[idxLru];. 
11550 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
11560 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
11570 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c  el;.    p->iTabl
11580 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  e = iTab;.    p-
11590 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
115a0 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  .    p->iReg = i
115b0 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70  Reg;.    p->temp
115c0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Reg = 0;.    p->
115d0 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
115e0 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72  acheCnt++;.    r
115f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eturn;.  }.}../*
11600 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
11610 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
11620 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
11630 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
11640 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
11650 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
11660 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
11670 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
11680 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
11690 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
116a0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
116b0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
116c0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
116d0 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52    int iLast = iR
116e0 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20  eg + nReg - 1;. 
116f0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
11700 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
11710 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11720 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11730 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11740 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
11750 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
11760 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c  f( r>=iReg && r<
11770 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
11780 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
11790 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
117a0 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
117b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
117c0 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
117d0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
117e0 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
117f0 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
11800 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
11810 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
11820 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
11830 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
11840 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
11850 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
11860 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
11870 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
11880 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
11890 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
118a0 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  Level++;.}../*.*
118b0 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
118c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
118d0 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
118e0 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
118f0 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
11900 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70 65 72  ious N Push oper
11910 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68 65  ations.  In othe
11920 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
11930 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 74 6f   the cache.** to
11940 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
11950 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20 61 67  s in N Pushes ag
11960 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
11970 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50  e3ExprCachePop(P
11980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11990 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t N){.  int i;. 
119a0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
119b0 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
119c0 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  N>0 );.  assert(
119d0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
119e0 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50 61  evel>=N );.  pPa
119f0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11a00 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d 30   -= N;.  for(i=0
11a10 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11a20 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11a30 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
11a40 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
11a50 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65  ->iReg && p->iLe
11a60 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
11a70 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20  heLevel ){.     
11a80 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
11a90 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
11aa0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
11ab0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11ac0 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64  ** When a cached
11ad0 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65   column is reuse
11ae0 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  d, make sure tha
11af0 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69  t its register i
11b00 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  s.** no longer a
11b10 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65  vailable as a te
11b20 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69  mp register.  ti
11b30 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61  cket #3879:  tha
11b40 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74  t same.** regist
11b50 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74  er might be in t
11b60 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74  he cache in mult
11b70 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20  iple places, so 
11b80 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65  be sure to.** ge
11b90 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73  t them all..*/.s
11ba0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
11bb0 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
11bc0 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50  gister(Parse *pP
11bd0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
11be0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
11bf0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
11c00 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
11c10 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
11c20 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
11c30 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11c40 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
11c50 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
11c60 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
11c70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11c80 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11c90 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
11ca0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
11cb0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
11cc0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
11cd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
11ce0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
11cf0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
11d00 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
11d10 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11d20 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
11d30 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
11d40 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
11d50 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
11d60 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
11d70 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   The cursor for 
11d80 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
11d90 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
11da0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
11db0 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
11dc0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
11dd0 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
11de0 74 20 74 68 65 20 76 61 6c 75 64 20 69 6e 74 6f  t the valud into
11df0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
11e00 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c  /.){.  if( iCol<
11e10 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
11e20 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
11e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11e40 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
11e50 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
11e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
11e70 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
11e80 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
11e90 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
11ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11eb0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
11ec0 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Cur, iCol, regOu
11ed0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
11ee0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol>=0 ){.    sql
11ef0 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
11f00 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  t(v, pTab, iCol,
11f10 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
11f20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
11f30 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
11f40 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
11f50 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
11f60 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
11f70 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
11f80 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20  lumn value in a 
11f90 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66  register.  An ef
11fa0 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  fort.** is made 
11fb0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
11fc0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
11fd0 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20  ister iReg, but 
11fe0 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67  this is.** not g
11ff0 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20  uaranteed.  The 
12000 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
12010 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  column value is 
12020 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
12030 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
12040 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
12050 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77  pTab in iTable w
12060 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
12070 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  .** is called.  
12080 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
12090 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  n code is genera
120a0 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74  ted that extract
120b0 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  s the rowid..*/.
120c0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
120d0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
120e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
120f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
12100 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
12110 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
12120 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
12130 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
12140 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
12150 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
12160 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
12170 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12180 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
12190 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
121a0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
121b0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
121c0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
121d0 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
121e0 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
121f0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
12200 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
12210 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
12220 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12230 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
12240 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12250 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12260 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12270 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
12280 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d   p->iReg>0 && p-
12290 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
122a0 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69  && p->iColumn==i
122b0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
122c0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
122d0 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
122e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
122f0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
12300 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29  pParse, p->iReg)
12310 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
12320 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
12330 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21  }  .  assert( v!
12340 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
12350 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
12360 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
12370 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
12380 2c 20 69 52 65 67 29 3b 0a 20 20 73 71 6c 69 74  , iReg);.  sqlit
12390 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
123a0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
123b0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
123c0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
123d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
123e0 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
123f0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
12400 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12410 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
12420 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
12430 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12440 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
12450 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12460 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12470 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12480 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12490 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20  p->iReg ){.     
124a0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
124b0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
124c0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
124d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
124e0 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
124f0 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
12500 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
12510 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
12520 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
12530 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
12540 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
12550 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
12560 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
12570 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12580 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
12590 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t){.  sqlite3Exp
125a0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
125b0 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f  rse, iStart, iCo
125c0 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  unt);.}../*.** G
125d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
125e0 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
125f0 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
12600 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
12610 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
12620 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
12630 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
12640 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
12650 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
12660 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
12670 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
12680 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
12690 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
126a0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
126b0 61 63 68 65 20 2a 70 3b 0a 20 20 69 66 28 20 4e  ache *p;.  if( N
126c0 45 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29  EVER(iFrom==iTo)
126d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
126e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
126f0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
12700 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
12710 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72 28  o, nReg);.  for(
12720 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12730 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
12740 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
12750 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
12760 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t x = p->iReg;. 
12770 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20     if( x>=iFrom 
12780 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20  && x<iFrom+nReg 
12790 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  ){.      p->iReg
127a0 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
127b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
127c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
127d0 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20  to copy content 
127e0 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
127f0 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
12800 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
12810 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a  To..iTo+nReg-1..
12820 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12830 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
12840 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12850 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
12860 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
12870 69 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69  i;.  if( NEVER(i
12880 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74  From==iTo) ) ret
12890 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
128a0 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nReg; i++){.  
128b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
128c0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
128d0 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 46 72 6f  e, OP_Copy, iFro
128e0 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a 20 20 7d  m+i, iTo+i);.  }
128f0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
12900 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
12910 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12920 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f  COVERAGE_TEST)./
12930 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
12940 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
12950 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
12960 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
12970 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
12980 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
12990 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  olumn cache..**.
129a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
129b0 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
129c0 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74  ssert() and test
129d0 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e  case() macros on
129e0 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e  ly.** and does n
129f0 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e  ot appear in a n
12a00 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ormal build..*/.
12a10 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
12a20 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
12a30 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12a40 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
12a50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
12a60 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
12a70 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
12a80 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
12a90 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
12aa0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
12ab0 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
12ac0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
12ad0 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
12ae0 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20   ) return 1;    
12af0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a  /*NO_TEST*/.  }.
12b00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
12b10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
12b20 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43  EBUG || SQLITE_C
12b30 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a  OVERAGE_TEST */.
12b40 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12b50 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
12b60 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
12b70 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
12b80 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
12b90 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
12ba0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
12bb0 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
12bc0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
12bd0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
12be0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
12bf0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
12c00 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
12c10 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
12c20 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
12c30 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
12c40 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
12c50 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
12c60 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
12c70 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
12c80 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
12c90 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
12ca0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
12cb0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
12cc0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
12cd0 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
12ce0 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
12cf0 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
12d00 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
12d10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
12d20 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
12d30 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
12d40 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
12d50 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
12d60 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
12d70 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
12d80 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
12d90 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12da0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
12db0 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
12dc0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
12dd0 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
12de0 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
12df0 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
12e00 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
12e10 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
12e20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
12e30 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
12e40 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
12e50 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
12e60 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
12e70 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
12e80 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
12e90 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
12ea0 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
12eb0 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
12ec0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
12ed0 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
12ee0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12ef0 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
12f00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
12f10 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
12f20 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
12f30 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
12f40 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
12f50 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12f60 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12f70 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
12f80 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
12f90 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
12fa0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
12fb0 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
12fc0 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
12fd0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
12fe0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
12ff0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
13000 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
13010 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
13020 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
13030 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
13040 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
13050 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
13060 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
13070 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
13080 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13090 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
130a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
130b0 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  g = pCol->iMem;.
130c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
130d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
130e0 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
130f0 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
13100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13110 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
13120 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
13130 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
13160 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
13170 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
13180 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
13190 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
131a0 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
131b0 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
131c0 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
131d0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
131e0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
131f0 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
13200 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
13210 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
13220 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20  en coding check 
13230 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
13240 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13250 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20  Parse->ckBase>0 
13260 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
13270 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
13280 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
13290 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  se;.      }else{
132a0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
132b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
132c0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
132d0 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13300 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
13310 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
13320 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
13330 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13340 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
13350 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
13360 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
13370 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
13380 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
13390 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
133a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
133b0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
133c0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
133d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
133e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
133f0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
13400 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
13410 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
13420 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
13430 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
13440 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
13450 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
13460 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
13470 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13480 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13490 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
134a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
134b0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
134c0 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30  g8, 0, target, 0
134d0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
134e0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
134f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13500 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
13510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
13530 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
13540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13560 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
13570 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
13580 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
13590 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
135a0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
135b0 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
135c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
135d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
135e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
135f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13600 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
13610 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
13620 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
13630 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
13640 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
13650 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
13660 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
13670 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
13680 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
13690 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
136a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
136b0 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
136c0 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
136d0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
136e0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
136f0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
13700 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13710 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
13720 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
13730 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
13740 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13750 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
13760 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
13770 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
13780 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13790 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
137a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
137b0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
137c0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
137d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
137e0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
137f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13800 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
13810 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
13820 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
13830 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
13840 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
13850 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
13860 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
13870 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20  en[0]=='?' .    
13880 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
13890 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
138a0 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  en, pParse->azVa
138b0 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
138c0 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1])==0 );.     
138d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
138e0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50  angeP4(v, -1, pP
138f0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
13900 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50  r->iColumn-1], P
13910 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
13920 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13930 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13940 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
13950 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
13960 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
13970 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13980 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
13990 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
139a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
139b0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
139c0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
139d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
139e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
139f0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
13a00 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
13a10 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
13a20 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
13a30 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
13a40 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
13a50 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
13a60 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  _op;.      inReg
13a70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13a80 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
13a90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
13aa0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73  arget);.      as
13ab0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
13ac0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
13ad0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
13ae0 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
13af0 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
13b00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
13b10 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66        to_op = af
13b20 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
13b30 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
13b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
13b50 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
13b60 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
13b70 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b  E_AFF_TEXT    );
13b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
13b90 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
13ba0 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
13bb0 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b  E_AFF_NONE    );
13bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
13bd0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
13be0 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54  ic || aff!=SQLIT
13bf0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
13c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
13c10 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20  o_op==OP_ToInt  
13c20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
13c30 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
13c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
13c50 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
13c60 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
13c70 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b  E_AFF_REAL    );
13c80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13c90 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
13ca0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
13cb0 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
13cc0 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74  oBlob );.      t
13cd0 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
13ce0 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a  OP_ToNumeric );.
13cf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13d00 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
13d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13d20 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  e( to_op==OP_ToR
13d30 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eal );.      if(
13d40 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
13d50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13d60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13d70 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
13d80 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
13d90 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
13da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13dc0 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67  (v, to_op, inReg
13dd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13de0 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
13df0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
13e00 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
13e10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13e20 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
13e30 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
13e40 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
13e50 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
13e60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
13e70 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
13e80 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
13e90 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
13ea0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
13eb0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
13ec0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
13ed0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
13ee0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
13ef0 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
13f00 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
13f10 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
13f20 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
13f30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13f40 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
13f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
13f60 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
13f70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13f80 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
13f90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
13fa0 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
13fb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13fc0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
13fd0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54  tcase( op==TK_GT
13fe0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13ff0 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  se( op==TK_GE );
14000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14010 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20   op==TK_EQ );.  
14020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14030 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
14040 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
14050 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14060 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14070 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
14080 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
14090 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
140a0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
140b0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
140c0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
140d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
140e0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
140f0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
14100 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
14110 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
14120 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
14130 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14140 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14150 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14160 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
14170 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14180 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
14190 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b  case TK_ISNOT: {
141a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
141b0 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
141c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
141d0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
141e0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
141f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14200 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14210 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
14220 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
14230 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14240 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
14250 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
14260 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
14270 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
14280 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63  : TK_NE;.      c
14290 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
142a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
142b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
142c0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
142d0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
142e0 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
142f0 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c  EP2 | SQLITE_NUL
14300 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
14310 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
14320 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
14330 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
14340 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
14350 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14360 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
14370 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
14380 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
14390 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
143a0 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
143b0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
143c0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
143d0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
143e0 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
143f0 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
14400 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
14410 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
14420 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
14430 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
14440 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
14450 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  P_And );.      a
14460 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
14470 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Or );.      ass
14480 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
14490 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _Add );.      as
144a0 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
144b0 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20  OP_Subtract );. 
144c0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
144d0 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
144e0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
144f0 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
14500 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20  _BitAnd );.     
14510 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
14520 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20  R==OP_BitOr );. 
14530 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14540 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
14550 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14560 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
14570 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20  ShiftLeft );.   
14580 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
14590 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
145a0 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
145b0 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
145c0 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20  OP_Concat );.   
145d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
145e0 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20  =TK_AND );.     
145f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14600 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  K_OR );.      te
14610 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
14620 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LUS );.      tes
14630 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49  tcase( op==TK_MI
14640 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NUS );.      tes
14650 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
14660 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  M );.      testc
14670 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41  ase( op==TK_BITA
14680 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ND );.      test
14690 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
146a0 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OR );.      test
146b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
146c0 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  SH );.      test
146d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
146e0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
146f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
14700 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65  HIFT );.      te
14710 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
14720 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
14730 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
14740 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14750 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
14760 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
14770 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
14780 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14790 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
147a0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
147b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
147c0 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
147d0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
147e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
147f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
14800 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14810 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
14820 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14830 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
14840 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
14850 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
14860 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
14870 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
14880 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
14890 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
148a0 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
148b0 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
148c0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69  , 1, target);.#i
148d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
148e0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
148f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14900 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
14910 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
14920 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14930 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14940 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14950 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
14960 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  (v, pLeft->u.zTo
14970 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ken, 1, target);
14980 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
14990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67  lse{.        reg
149a0 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c  Free1 = r1 = sql
149b0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
149c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
149d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
149e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
149f0 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   0, r1);.       
14a00 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
14a10 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14a20 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14a30 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
14a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14a50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
14a60 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
14a70 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
14a80 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
14a90 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
14aa0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
14ab0 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
14ac0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14ad0 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
14ae0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
14af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14b00 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
14b10 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ot );.      asse
14b20 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
14b30 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
14b40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
14b50 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NOT );.      tes
14b60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
14b70 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
14b80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14b90 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14ba0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14bb0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
14bc0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
14bd0 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  0 );.      inReg
14be0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
14bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c00 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
14c10 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
14c20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14c30 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
14c40 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
14c50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
14c60 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
14c70 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
14c80 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
14c90 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
14ca0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
14cb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14cc0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
14cd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ce0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
14cf0 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
14d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14d10 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
14d20 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
14d30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14d40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
14d50 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
14d60 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
14d70 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
14d80 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
14d90 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14da0 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
14db0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14dc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14dd0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
14de0 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
14df0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14e00 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
14e10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14e20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
14e30 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
14e40 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
14e50 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
14e60 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
14e70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
14e80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
14e90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
14ea0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
14eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14ec0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14ed0 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
14ee0 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
14ef0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
14f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f10 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f     inReg = pInfo
14f20 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
14f30 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
14f40 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14f50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14f60 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
14f70 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
14f80 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
14f90 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
14fa0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
14fb0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
14fc0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
14fd0 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
14fe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
14ff0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
15000 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
15010 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
15020 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
15030 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
15040 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ct */.      int 
15050 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
15060 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
15070 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  the function nam
15080 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
15090 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
150a0 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
150b0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
150c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  */.      int con
150d0 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
150e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
150f0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
15100 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
15110 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15140 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
15150 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
15160 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
15170 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
15180 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
15190 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
151a0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
151b0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
151c0 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ce */..      ass
151d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
151e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
151f0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
15200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15210 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20  ==TK_CONST_FUNC 
15220 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15230 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  e( op==TK_FUNCTI
15240 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ON );.      if( 
15250 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
15260 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
15270 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
15280 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
15290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
152a0 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
152b0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
152c0 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
152d0 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
152e0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
152f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15300 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15310 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
15320 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
15330 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
15340 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65      nId = sqlite
15350 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a  3Strlen30(zId);.
15360 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
15370 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
15380 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  (db, zId, nId, n
15390 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
153a0 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
153b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
153c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
153d0 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
153e0 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20  ction: %.*s()", 
153f0 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
15400 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15410 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
15420 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
15430 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
15440 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
15450 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
15460 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
15470 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
15480 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
15490 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20   evalation of.  
154a0 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
154b0 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
154c0 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
154d0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
154e0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67    if( pDef->flag
154f0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
15500 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
15510 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
15520 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
15530 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
15550 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
15560 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15570 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
15580 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
15590 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
155a0 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
155b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
155c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155d0 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
155e0 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
155f0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
15600 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15610 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
15620 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20   target, 1);.   
15630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15640 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
15650 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
15660 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15670 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
15680 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  i].pExpr, target
15690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
156a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
156b0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
156c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
156d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
156e0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
156f0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
15700 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
15710 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
15720 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   ){.        r1 =
15730 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15740 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
15750 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rg);.        sql
15760 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
15770 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  h(pParse);     /
15780 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
15790 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20  d34be */.       
157a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
157b0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
157c0 20 70 46 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a   pFarg, r1, 1);.
157d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
157e0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
157f0 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63  se, 1);   /* Tic
15800 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
15810 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
15820 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
15830 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
15840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15850 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
15860 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
15870 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
15880 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
15890 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
158a0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
158b0 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
158c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
158d0 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
158e0 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
158f0 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
15900 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
15910 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
15920 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
15930 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
15940 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
15950 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
15960 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
15970 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
15980 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
15990 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
159a0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
159b0 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
159c0 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
159d0 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
159e0 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
159f0 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
15a00 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
15a10 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
15a20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
15a30 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
15a40 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
15a50 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
15a60 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
15a70 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
15a80 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
15a90 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
15aa0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
15ab0 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
15ac0 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
15ad0 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
15ae0 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
15af0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
15b00 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
15b10 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
15b20 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
15b30 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
15b40 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
15b50 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
15b60 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
15b70 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
15b80 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
15b90 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
15ba0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
15bb0 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
15bc0 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
15bd0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
15be0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
15bf0 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69  ndif.      for(i
15c00 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
15c10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
15c20 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
15c30 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
15c40 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
15c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
15c60 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29  stMask |= (1<<i)
15c70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15c80 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
15c90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
15ca0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
15cb0 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
15cc0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
15cd0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
15ce0 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
15cf0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
15d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15d10 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
15d20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
15d30 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
15d40 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
15d50 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
15d60 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
15d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15d80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
15d90 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
15da0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
15db0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
15dc0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
15dd0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15de0 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
15df0 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
15e00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15e10 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
15e20 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
15e30 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
15e40 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
15e50 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
15e60 20 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b 0a     if( nFarg ){.
15e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15e80 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
15e90 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
15ea0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
15eb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
15ec0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15ed0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
15ee0 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
15ef0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
15f00 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  CT: {.      test
15f10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
15f20 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
15f30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
15f40 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e  LECT );.      in
15f50 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  Reg = sqlite3Cod
15f60 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
15f70 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
15f80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15f90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15fa0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
15fb0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
15fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15fd0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
15fe0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
15ff0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16000 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
16010 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16020 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
16030 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
16040 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
16050 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
16060 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
16070 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
16080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16090 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
160a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
160b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
160c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
160d0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
160e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
160f0 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
16100 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
16110 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16120 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
16130 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
16140 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
16150 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16160 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
16170 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
16180 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
16190 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
161a0 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
161b0 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
161c0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
161d0 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
161e0 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
161f0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
16200 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
16210 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
16220 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
16230 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
16240 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
16250 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
16260 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16270 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
16280 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
16290 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
162a0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
162b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
162c0 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Item = pExpr->x.
162d0 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
162e0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
162f0 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  LItem->pExpr;.. 
16300 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16310 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16320 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
16330 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
16340 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
16350 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16360 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
16370 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
16380 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
16390 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
163a0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
163b0 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c  ;.      r3 = sql
163c0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
163d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34  Parse);.      r4
163e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
163f0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16400 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
16410 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
16420 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
16450 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
16460 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
16470 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
16480 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
16490 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
164a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
164b0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
164c0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
164d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
164e0 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
164f0 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
16500 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
16510 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
16520 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
16530 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
16540 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20  Le, r1, r2, r4, 
16550 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
16560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16570 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
16580 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67  nd, r3, r4, targ
16590 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
165a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
165b0 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
165c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
165d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
165e0 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , r4);.      bre
165f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16600 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
16610 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
16620 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
16630 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
16640 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
16650 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16660 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
16670 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
16680 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
16690 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
166a0 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
166b0 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
166c0 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
166d0 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
166e0 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
166f0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
16700 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
16710 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
16720 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
16730 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
16740 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
16750 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
16760 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
16770 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
16780 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
16790 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
167a0 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
167b0 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
167c0 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
167d0 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
167e0 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
167f0 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
16800 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
16810 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
16820 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
16830 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
16840 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
16850 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
16860 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
16870 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
16880 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
16890 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
168a0 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
168b0 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
168c0 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
168d0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
168e0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
168f0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
16900 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
16910 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
16920 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
16930 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
16940 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
16950 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
16960 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
16970 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
16980 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
16990 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
169a0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
169b0 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
169c0 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
169d0 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
169e0 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
169f0 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
16a00 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
16a10 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
16a20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
16a30 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
16a40 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
16a50 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
16a60 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
16a70 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
16a80 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
16a90 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
16aa0 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
16ab0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
16ac0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
16ad0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
16ae0 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
16af0 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
16b00 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
16b10 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
16b20 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
16b30 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
16b40 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
16b50 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
16b60 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
16b70 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
16b80 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
16b90 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
16ba0 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
16bb0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
16bc0 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
16bd0 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
16be0 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
16bf0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
16c00 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16c10 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
16c20 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
16c30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16c40 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
16c50 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
16c60 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
16c70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16c80 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
16c90 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
16ca0 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
16cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16cc0 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
16cd0 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
16ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16cf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
16d00 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
16d10 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
16d20 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d  ent((v, "%s.%s -
16d30 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20  > $%d",.        
16d40 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
16d50 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
16d60 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
16d70 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
16d80 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
16d90 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
16da0 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c  iColumn].zName),
16db0 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a  .        target.
16dc0 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
16dd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
16de0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
16df0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
16e00 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
16e10 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
16e20 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
16e30 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
16e40 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
16e50 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
16e60 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
16e70 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20  s really real.  
16e80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  */.      if( pEx
16e90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a  pr->iColumn>=0 .
16ea0 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e         && pTab->
16eb0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
16ec0 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
16ed0 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
16ee0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f00 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
16f10 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20  nity, target);. 
16f20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
16f30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16f40 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
16f50 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
16f60 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
16f70 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
16f80 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
16f90 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
16fa0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
16fb0 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
16fc0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
16fd0 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
16fe0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
16ff0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
17000 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
17010 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
17020 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
17030 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
17040 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
17050 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
17060 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
17070 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
17080 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
17090 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
170a0 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
170b0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
170c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
170d0 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
170e0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
170f0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
17100 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20  pExpr->pRight.  
17110 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
17120 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72  tional.  If ther
17130 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45  e is no.    ** E
17140 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  LSE clause and n
17150 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74  o other term mat
17160 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ches, then the r
17170 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
17180 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73   ** exprssion is
17190 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
171a0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
171b0 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
171c0 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
171d0 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
171e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
171f0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
17200 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
17210 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
17220 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
17230 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
17240 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
17250 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
17260 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
17270 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
17280 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
17290 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
172a0 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
172b0 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
172c0 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
172f0 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
17300 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
17310 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
17340 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
17350 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
17360 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
17390 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
173a0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
173d0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
173e0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
17410 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
17420 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17430 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
17440 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
17450 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
17460 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
17470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17480 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
17490 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
174a0 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58       Expr cacheX
174b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
174c0 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64         /* Cached
174d0 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f   expression X */
174e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17510 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
17520 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
17530 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
17540 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
17550 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
17560 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
17570 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
17580 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
17590 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
175a0 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
175b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
175c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
175d0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
175e0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
175f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17600 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ((pExpr->x.pList
17610 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
17620 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
17630 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
17640 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
17650 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
17660 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17670 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
17680 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
17690 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
176a0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
176b0 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
176c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
176d0 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
176e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
176f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
17700 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
17710 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
17720 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
17730 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17740 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  e( pX->op==TK_RE
17750 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
17760 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20    cacheX.iTable 
17770 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17780 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
17790 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
177a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
177b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
177c0 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70         cacheX.op
177d0 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
177e0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
177f0 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
17800 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
17810 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b  pLeft = &cacheX;
17820 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d  .        pTest =
17830 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20   &opCompare;.   
17840 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62       /* Ticket b
17850 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65  351d95f9cd5ef17e
17860 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31  9d9dbae18f5ca861
17870 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20  1190001:.       
17880 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e   ** The value in
17890 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20   regFree1 might 
178a0 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74  get SCopy-ed int
178b0 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c  o the file resul
178c0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  t..        ** So
178d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
178e0 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67  the regFree1 reg
178f0 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75  ister is not reu
17900 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20  sed for other.  
17910 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65        ** purpose
17920 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f  s and possibly o
17930 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
17940 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
17950 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17970 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
17980 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17990 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
179a0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
179b0 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
179c0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
179d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
179e0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
179f0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
17a00 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
17a10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
17a20 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
17a30 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
17a40 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
17a50 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
17a60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17a70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17a80 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
17a90 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
17aa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
17ab0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
17ac0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
17ad0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
17ae0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17af0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
17b00 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
17b10 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
17b20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
17b30 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
17b40 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
17b50 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ER );.        sq
17b60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
17b70 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
17b80 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  i+1].pExpr, targ
17b90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
17ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17bb0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e  , OP_Goto, 0, en
17bc0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
17bd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17be0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
17bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17c00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17c10 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
17c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17c30 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
17c40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17c50 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
17c60 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
17c70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
17c80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17c90 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a  Right, target);.
17ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17cb0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
17cc0 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  se, 1);.      }e
17cd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
17ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17cf0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
17d00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
17d10 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
17d20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
17d30 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
17d40 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
17d50 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
17d60 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
17d70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17d80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17d90 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
17da0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17db0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17dc0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
17dd0 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
17de0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17df0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
17e00 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
17e10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
17e20 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
17e30 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
17e40 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
17e50 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
17e60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
17e70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
17e80 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
17e90 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
17ea0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
17eb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17ec0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17ee0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
17ef0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
17f00 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
17f10 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
17f20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
17f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17f40 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
17f50 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
17f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
17f70 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
17f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
17f90 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
17fa0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17fb0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
17fc0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
17fd0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
17fe0 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
17ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18000 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
18010 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
18020 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
18030 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
18040 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en,0);.      }el
18050 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
18060 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
18070 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
18080 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72  >affinity, pExpr
18090 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
180a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
180b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
180c0 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
180d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
180e0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
180f0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
18100 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18110 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
18120 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
18130 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
18140 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
18150 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
18160 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
18170 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
18180 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
18190 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
181a0 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
181b0 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
181c0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
181d0 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
181e0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
181f0 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
18200 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
18210 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
18220 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
18230 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
18240 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
18250 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
18260 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
18270 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  o zero..*/.int s
18280 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18290 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
182a0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
182b0 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
182c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
182d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
182e0 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69  .  int r2 = sqli
182f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18300 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
18310 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d   r1);.  if( r2==
18320 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20  r1 ){.    *pReg 
18330 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = r1;.  }else{. 
18340 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
18350 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18360 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20   r1);.    *pReg 
18370 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18380 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
18390 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
183a0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
183b0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
183c0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
183d0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
183e0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
183f0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
18400 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
18410 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
18420 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e  er target..*/.in
18430 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
18440 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
18450 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
18460 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
18470 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
18480 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
18490 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
184a0 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
184b0 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
184c0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
184d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
184e0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
184f0 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
18500 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
18510 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
18520 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
18530 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
18540 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18550 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
18560 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
18570 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  be || pParse->db
18580 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18590 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
185a0 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
185b0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
185c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
185d0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
185e0 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
185f0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
18600 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18610 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  target;.}../*.**
18620 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18630 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65  hat evalutes the
18640 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
18650 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
18660 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
18670 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
18680 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
18690 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
186a0 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
186b0 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
186c0 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
186d0 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
186e0 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
186f0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
18700 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
18710 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
18720 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
18730 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
18740 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18750 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
18760 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
18770 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
18780 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
18790 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
187a0 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
187b0 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
187c0 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
187d0 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
187e0 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
187f0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
18800 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
18810 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
18820 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
18830 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
18840 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20  nReg;.  inReg = 
18850 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
18860 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
18870 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
18880 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
18890 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
188a0 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65  is called for te
188b0 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72  rms to INSERT or
188c0 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68   UPDATE.  And th
188d0 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  e only.  ** othe
188e0 72 20 70 6c 61 63 65 20 77 68 65 72 65 20 65 78  r place where ex
188f0 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65  pressions can be
18900 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
18910 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20  TK_REGISTER is. 
18920 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61   ** in WHERE cla
18930 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
18940 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79   So as currently
18950 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68   implemented, th
18960 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77  ere is.  ** no w
18970 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49  ay for a TK_REGI
18980 53 54 45 52 20 74 6f 20 65 78 69 73 74 20 68 65  STER to exist he
18990 72 65 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d  re.  But it seem
189a0 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a  s prudent to.  *
189b0 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59  * keep the ALWAY
189c0 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65 20  S() in case the 
189d0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
189e0 20 63 68 61 6e 67 65 20 77 69 74 68 20 66 75 74   change with fut
189f0 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  ure.  ** modific
18a00 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63  ations or enhanc
18a10 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
18a20 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f   ALWAYS(pExpr->o
18a30 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20  p!=TK_REGISTER) 
18a40 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65  ){  .    int iMe
18a50 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b  m;.    iMem = ++
18a60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18a80 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
18a90 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  inReg, iMem);.  
18aa0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
18ab0 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  = iMem;.    pExp
18ac0 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e  r->op2 = pExpr->
18ad0 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  op;.    pExpr->o
18ae0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
18af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e  .  }.  return in
18b00 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Reg;.}../*.** Re
18b10 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45 78  turn TRUE if pEx
18b20 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e  pr is an constan
18b30 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  t expression tha
18b40 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
18b50 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e  .** for factorin
18b60 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  g out of a loop.
18b70 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78    Appropriate ex
18b80 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a  pressions are:.*
18b90 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65  *.**    *  Any e
18ba0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
18bb0 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20  valuates to two 
18bc0 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e  or more opcodes.
18bd0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79  .**.**    *  Any
18be0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f   OP_Integer, OP_
18bf0 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Real, OP_String,
18c00 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c   OP_Blob, OP_Nul
18c10 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20  l, .**       or 
18c20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74  OP_Variable that
18c30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
18c40 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
18c50 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69   .**       speci
18c60 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  fic register..**
18c70 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .** There is no 
18c80 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69  point in factori
18c90 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e  ng out single-in
18ca0 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
18cb0 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  nt.** expression
18cc0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
18cd0 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61  e placed in a pa
18ce0 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
18cf0 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  r.  .** We could
18d00 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74   factor them out
18d10 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f  , but then we wo
18d20 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e  uld end up addin
18d30 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79  g an.** OP_SCopy
18d40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
18d50 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 69  move the value i
18d60 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
18d70 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65  register.** late
18d80 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 20  r.  We might as 
18d90 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68  well just use th
18da0 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72  e original instr
18db0 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76  uction and.** av
18dc0 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  oid the OP_SCopy
18dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18de0 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72  isAppropriateFor
18df0 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a  Factoring(Expr *
18e00 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  p){.  if( !sqlit
18e10 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
18e20 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20  NotJoin(p) ){.  
18e30 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
18e40 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78  Only constant ex
18e50 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70  pressions are ap
18e60 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61  propriate for fa
18e70 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  ctoring */.  }. 
18e80 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26   if( (p->flags &
18e90 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d   EP_FixedDest)==
18ea0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18eb0 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74  1;  /* Any const
18ec0 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66 69  ant without a fi
18ed0 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  xed destination 
18ee0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  is appropriate *
18ef0 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
18f00 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29  ->op==TK_UPLUS )
18f10 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
18f20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
18f30 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
18f40 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
18f50 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
18f60 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  LOB:.#endif.    
18f70 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
18f80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  :.    case TK_IN
18f90 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
18fa0 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
18fb0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
18fc0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
18fd0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
18fe0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42  ( p->op==TK_BLOB
18ff0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19000 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  se( p->op==TK_VA
19010 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20  RIABLE );.      
19020 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
19030 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  =TK_INTEGER );. 
19040 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19050 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
19060 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19070 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c  ( p->op==TK_NULL
19080 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19090 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  se( p->op==TK_ST
190a0 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a  RING );.      /*
190b0 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74   Single-instruct
190c0 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69  ion constants wi
190d0 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74 69  th a fixed desti
190e0 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20  nation are.     
190f0 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20   ** better done 
19100 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20  in-line.  If we 
19110 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65  factor them, the
19120 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a  y will just end.
19130 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65        ** up gene
19140 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f  rating an OP_SCo
19150 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  py to move the v
19160 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73 74  alue to the dest
19170 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ination.      **
19180 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20   register. */.  
19190 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
191a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
191b0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
191c0 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70  if( p->pLeft->op
191d0 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d  ==TK_FLOAT || p-
191e0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
191f0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
19200 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
19210 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
19220 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
19230 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
19240 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
19250 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
19260 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
19270 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
19280 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
19290 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66  opriate for.** f
192a0 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
192b0 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61  a loop, then eva
192c0 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
192d0 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  sion.** into a r
192e0 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76  egister and conv
192f0 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69  ert the expressi
19300 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47  on into a TK_REG
19310 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73  ISTER.** express
19320 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
19330 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72  nt evalConstExpr
19340 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
19350 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
19360 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
19370 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
19380 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  e;.  switch( pEx
19390 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
193a0 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61  se TK_IN:.    ca
193b0 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
193c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
193d0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
193e0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
193f0 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
19400 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
19410 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
19420 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  T_FUNC: {.      
19430 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  /* The arguments
19440 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68   to a function h
19450 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74  ave a fixed dest
19460 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ination..      *
19470 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73  * Mark them this
19480 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65   way to avoid ge
19490 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64  nerated unneeded
194a0 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20   OP_SCopy.      
194b0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  ** instructions.
194c0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
194d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
194e0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
194f0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
19500 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19510 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
19520 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
19530 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
19540 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69       int i = pLi
19550 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
19560 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
19570 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
19580 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20   pList->a;.     
19590 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d     for(; i>0; i-
195a0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
195b0 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
195c0 53 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  S(pItem->pExpr) 
195d0 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  ) pItem->pExpr->
195e0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65  flags |= EP_Fixe
195f0 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  dDest;.        }
19600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
19610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
19620 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69    if( isAppropri
19630 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
19640 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
19650 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d  t r1 = ++pParse-
19660 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72  >nMem;.    int r
19670 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  2;.    r2 = sqli
19680 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
19690 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
196a0 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e 45   r1);.    if( NE
196b0 56 45 52 28 72 31 21 3d 72 32 29 20 29 20 73 71  VER(r1!=r2) ) sq
196c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
196d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
196e0 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20  .    pExpr->op2 
196f0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  = pExpr->op;.   
19700 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
19710 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45  REGISTER;.    pE
19720 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32  xpr->iTable = r2
19730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
19740 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65  _Prune;.  }.  re
19750 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
19760 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65  e;.}../*.** Pree
19770 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74  valuate constant
19780 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
19790 77 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64  within pExpr and
197a0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
197b0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
197c0 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70  rs.  Modify pExp
197d0 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  r so that the co
197e0 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73  nstant subexpres
197f0 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52  ions.** are TK_R
19800 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20  EGISTER opcodes 
19810 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
19820 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61  e precomputed va
19830 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lues..**.** This
19840 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19850 2d 6f 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20  -op if the jump 
19860 74 6f 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68  to the cookie-ch
19870 65 63 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20  eck code has.** 
19880 61 6c 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20  already occur.  
19890 53 69 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65  Since the cookie
198a0 2d 63 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67  -check jump is g
198b0 65 6e 65 72 61 74 65 64 20 70 72 69 6f 72 20 74  enerated prior t
198c0 6f 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73  o.** any other s
198d0 65 72 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e  erious processin
198e0 67 2c 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e  g, this check en
198f0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 72 65  sures that there
19900 20 69 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f   is no.** way to
19910 20 61 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61   accidently bypa
19920 73 73 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  ss the constant 
19930 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e  initializations.
19940 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19950 69 6e 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f  ine is also a no
19960 2d 6f 70 20 69 66 20 74 68 65 20 53 51 4c 49 54  -op if the SQLIT
19970 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
19980 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
19990 20 69 73 20 64 69 73 61 62 6c 65 64 20 76 69 61   is disabled via
199a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73   the sqlite3_tes
199b0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
199c0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
199d0 5a 41 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65  ZATIONS).** inte
199e0 72 66 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c  rface.  This all
199f0 6f 77 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74  ows test logic t
19a00 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
19a10 65 20 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73  e same answer is
19a20 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  .** obtained for
19a30 20 71 75 65 72 69 65 73 20 72 65 67 61 72 64 6c   queries regardl
19a40 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
19a50 72 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20  r not constants 
19a60 61 72 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74  are.** precomput
19a70 65 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ed into register
19a80 73 20 6f 72 20 69 66 20 74 68 65 79 20 61 72 65  s or if they are
19a90 20 69 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e   inserted in-lin
19aa0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
19ab0 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
19ac0 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  nts(Parse *pPars
19ad0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
19ae0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69  .  Walker w;.  i
19af0 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
19b00 65 47 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eGoto ) return;.
19b10 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64    if( (pParse->d
19b20 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
19b30 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
19b40 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
19b50 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
19b60 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72   = evalConstExpr
19b70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
19b80 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70  lback = 0;.  w.p
19b90 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
19ba0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
19bb0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
19bc0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19bd0 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
19be0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
19bf0 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
19c00 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
19c10 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
19c20 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
19c30 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
19c40 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
19c50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19c60 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
19c70 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  ts evaluated..*/
19c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
19c90 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
19ca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19cb0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
19cc0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
19cd0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
19ce0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
19cf0 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
19d00 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
19d10 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
19d20 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
19d30 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61  ts */.  int doHa
19d40 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61  rdCopy     /* Ma
19d50 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f  ke a hard copy o
19d60 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
19d70 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
19d80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19d90 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
19da0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
19db0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
19dc0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
19dd0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
19de0 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e  Vdbe!=0 );  /* N
19df0 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66  ever gets this f
19e00 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a  ar otherwise */.
19e10 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
19e20 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  pr;.  for(pItem=
19e30 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
19e40 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
19e50 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
19e60 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
19e70 72 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52 65 67  r;.    int inReg
19e80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19e90 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
19ea0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
19eb0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
19ec0 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
19ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ee0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
19ef0 64 62 65 2c 20 64 6f 48 61 72 64 43 6f 70 79 20  dbe, doHardCopy 
19f00 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53  ? OP_Copy : OP_S
19f10 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
19f30 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
19f40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19f50 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
19f60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
19f70 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
19f80 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
19f90 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
19fa0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
19fb0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
19fc0 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
19fd0 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
19fe0 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
19ff0 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1a000 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1a010 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1a020 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
1a030 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a040 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1a050 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1a060 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1a070 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1a080 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1a090 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1a0a0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
1a0b0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
1a0c0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1a0d0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1a0e0 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20   if the jump is 
1a0f0 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a  taken */.  int j
1a100 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20  umpIfTrue,   /* 
1a110 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1a120 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1a130 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  true */.  int ju
1a140 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54  mpIfNull    /* T
1a150 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1a160 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e  the BETWEEN is N
1a170 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ULL */.){.  Expr
1a180 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
1a190 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
1a1a0 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
1a1b0 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
1a1c0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
1a1d0 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
1a1e0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
1a1f0 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
1a200 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
1a210 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
1a220 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
1a230 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1a240 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1a250 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
1a260 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
1a270 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1a280 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1a290 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1a2a0 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
1a2b0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
1a2c0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1a2d0 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
1a2e0 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
1a2f0 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
1a300 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
1a310 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
1a320 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
1a330 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1a340 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
1a350 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1a360 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1a370 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
1a380 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
1a390 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
1a3a0 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
1a3b0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1a3c0 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
1a3d0 70 72 3b 0a 20 20 65 78 70 72 58 2e 69 54 61 62  pr;.  exprX.iTab
1a3e0 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
1a3f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1a400 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
1a410 65 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20  e1);.  exprX.op 
1a420 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1a430 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20   if( jumpIfTrue 
1a440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1a450 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1a460 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
1a470 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1a480 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1a490 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1a4a0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1a4b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1a4c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a4d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a4e0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1a4f0 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
1a500 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
1a510 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
1a520 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1a530 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1a540 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
1a550 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1a560 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1a570 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1a580 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1a590 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1a5a0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1a5b0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1a5c0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1a5d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a5e0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1a5f0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1a600 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1a610 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a620 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1a630 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1a640 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1a650 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a660 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1a670 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1a680 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1a690 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1a6a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1a6b0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1a6c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a6d0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1a6e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1a6f0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1a700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1a710 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
1a720 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
1a730 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
1a740 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
1a750 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
1a760 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1a770 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
1a780 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1a790 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1a7a0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1a7b0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
1a7c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
1a7d0 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
1a7e0 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
1a7f0 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
1a800 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
1a810 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1a820 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
1a830 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
1a840 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
1a850 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
1a860 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
1a870 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
1a880 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
1a890 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
1a8a0 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
1a8b0 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
1a8c0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
1a8d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1a8e0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
1a8f0 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
1a900 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
1a910 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
1a920 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
1a930 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
1a940 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
1a950 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
1a960 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
1a970 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
1a980 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1a990 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
1a9a0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
1a9b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1a9c0 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
1a9d0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1a9e0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1a9f0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1aa00 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1aa10 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1aa20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1aa30 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1aa40 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1aa50 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1aa60 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1aa70 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1aa80 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1aa90 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1aaa0 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
1aab0 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61  turn;  /* Exista
1aac0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
1aad0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
1aae0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
1aaf0 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
1ab00 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
1ab10 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
1ab20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1ab30 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1ab40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1ab50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
1ab60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ab70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1ab80 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1ab90 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1aba0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1abb0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1abc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1abd0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1abe0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1abf0 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1ac00 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1ac10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ac20 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1ac30 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ac40 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1ac50 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1ac60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ac70 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1ac80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ac90 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1aca0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1acb0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1acc0 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
1acd0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ace0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1acf0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1ad00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ad10 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1ad20 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1ad30 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1ad40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1ad50 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1ad60 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1ad70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ad80 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1ad90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1ada0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1adb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1adc0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1add0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1ade0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1adf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ae00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ae10 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1ae20 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1ae30 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1ae40 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1ae50 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1ae60 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
1ae70 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
1ae80 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
1ae90 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
1aea0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1aeb0 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
1aec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1aed0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
1aee0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1aef0 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
1af00 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
1af10 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
1af20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1af30 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1af40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1af50 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1af60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1af70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1af80 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1af90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1afa0 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1afb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1afc0 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1afd0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1afe0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1aff0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1b000 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1b010 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1b020 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1b030 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1b040 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1b050 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1b060 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1b070 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1b080 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1b090 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1b0a0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1b0b0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1b0c0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1b0d0 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1b0e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1b0f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b100 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1b110 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b120 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b130 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1b140 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1b150 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1b160 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
1b170 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1b180 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
1b190 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b1a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1b1b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1b1c0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1b1d0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1b1e0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1b1f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1b200 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1b210 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1b220 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1b230 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
1b240 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1b250 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1b260 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
1b290 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
1b2a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1b2b0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1b2c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1b2d0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1b2e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b2f0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1b300 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1b310 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1b320 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1b330 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
1b340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1b350 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
1b360 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
1b370 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1b380 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
1b390 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1b3a0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1b3b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1b3c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1b3d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1b3e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1b3f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b400 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1b410 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
1b420 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1b430 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1b440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b450 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1b460 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1b470 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1b480 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
1b490 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
1b4a0 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75  xpr, dest, 1, ju
1b4b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1b4c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1b4d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b4e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1b4f0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1b500 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
1b510 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1b520 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b530 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1b540 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
1b550 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
1b560 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
1b570 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1b580 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1b590 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1b5a0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1b5b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b5c0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1b5d0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1b5e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b5f0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
1b600 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1b610 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1b620 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1b630 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1b640 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1b650 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
1b660 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1b670 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1b680 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
1b690 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
1b6a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b6b0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1b6c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b6d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1b6e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b6f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1b700 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1b710 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1b720 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1b730 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b740 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
1b750 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
1b760 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1b770 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1b780 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1b790 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1b7a0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1b7b0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1b7c0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
1b7d0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1b7e0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1b7f0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1b800 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
1b810 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1b820 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1b830 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1b840 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1b850 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
1b860 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
1b870 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1b880 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
1b890 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
1b8a0 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
1b8b0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1b8c0 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
1b8d0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1b8e0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1b8f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1b900 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1b910 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1b920 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1b930 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1b940 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1b950 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1b960 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1b970 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1b980 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1b990 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1b9a0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
1b9b0 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63  urn; /* Existanc
1b9c0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1b9d0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1b9e0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1b9f0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
1ba00 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
1ba10 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
1ba20 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
1ba30 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1ba40 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
1ba60 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
1ba70 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
1ba80 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
1ba90 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
1baa0 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
1bab0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1bac0 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
1bad0 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
1bae0 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
1baf0 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
1bb00 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
1bb10 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
1bb20 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
1bb30 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1bb40 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
1bb50 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
1bb60 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
1bb70 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
1bb80 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
1bb90 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
1bba0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
1bbb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
1bbc0 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
1bbd0 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
1bbe0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
1bbf0 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
1bc00 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
1bc10 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
1bc20 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
1bc30 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
1bc40 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
1bc50 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
1bc60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1bc70 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
1bc80 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
1bc90 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
1bca0 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
1bcb0 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
1bcc0 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
1bcd0 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
1bce0 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
1bcf0 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
1bd00 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
1bd10 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1bd20 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
1bd30 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1bd40 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
1bd50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
1bd60 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1bd70 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
1bd80 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
1bd90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1bda0 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
1bdb0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
1bdc0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1bdd0 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
1bde0 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
1bdf0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
1be00 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
1be10 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1be20 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
1be30 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
1be40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1be50 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
1be60 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
1be70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
1be80 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
1be90 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
1bea0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1beb0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1bec0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1bed0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1bee0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1bef0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1bf00 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1bf10 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1bf20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bf30 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1bf40 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1bf50 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1bf60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bf70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1bf80 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
1bf90 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1bfa0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1bfb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bfc0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1bfd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bfe0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1bff0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1c000 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1c010 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1c020 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
1c030 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
1c040 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1c050 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1c060 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1c070 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1c080 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1c090 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1c0a0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1c0b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c0c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1c0d0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1c0e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c0f0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1c100 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1c110 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1c120 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1c130 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1c140 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1c150 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1c160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c170 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1c180 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1c190 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1c1a0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1c1b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1c1c0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1c1d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1c1e0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
1c1f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1c200 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
1c210 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c220 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
1c230 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1c240 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
1c250 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
1c260 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c270 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
1c280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c290 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1c2a0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1c2b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1c2c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1c2d0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1c2e0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1c2f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c300 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c310 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1c320 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1c330 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1c340 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1c350 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1c380 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1c390 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1c3a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1c3b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1c3c0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1c3d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c3e0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1c3f0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1c400 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1c410 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1c420 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1c430 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1c440 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1c450 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1c460 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1c470 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1c480 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1c490 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1c4a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c4b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1c4c0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1c4d0 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
1c4e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
1c4f0 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
1c500 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1c510 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c520 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1c530 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1c540 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1c550 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1c560 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1c570 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1c580 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1c590 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1c5a0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1c5b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c5c0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1c5d0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1c5e0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  LL: {.      test
1c5f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1c600 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1c610 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1c620 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1c630 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1c640 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1c650 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1c660 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1c670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c680 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1c690 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1c6a0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1c6b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c6c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c6d0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1c6e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1c6f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1c700 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1c710 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1c720 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70  r, dest, 0, jump
1c730 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1c740 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1c750 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c760 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1c770 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1c780 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
1c790 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c7a0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1c7b0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1c7c0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1c7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1c7e0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
1c7f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1c800 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1c810 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1c820 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1c830 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
1c840 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1c850 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1c860 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
1c870 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1c880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1c890 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1c8a0 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
1c8b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1c8c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1c8d0 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
1c8e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c8f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
1c900 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
1c910 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1c920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1c930 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1c940 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1c950 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1c960 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c970 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1c980 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1c990 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1c9a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c9b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1c9c0 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
1c9d0 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
1c9e0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
1c9f0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1ca00 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1ca10 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
1ca20 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
1ca30 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
1ca40 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1ca50 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
1ca60 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
1ca70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
1ca80 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
1ca90 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
1caa0 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
1cab0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
1cac0 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
1cad0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1cae0 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
1caf0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1cb00 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65  rn 2 even if the
1cb10 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1cb20 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
1cb30 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
1cb40 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
1cb50 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
1cb60 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
1cb70 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
1cb80 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  2 just to be saf
1cb90 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
1cba0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1cbb0 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  s 2, then you do
1cbc0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
1cbd0 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
1cbe0 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
1cbf0 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
1cc00 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
1cc10 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65   get a 0 or 1 re
1cc20 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
1cc30 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
1cc40 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
1cc50 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
1cc60 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
1cc70 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1cc80 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
1cc90 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
1cca0 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74  t an extra 2 - t
1ccb0 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
1ccc0 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
1ccd0 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
1cce0 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
1ccf0 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
1cd00 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75  rrect 0 or 1 cou
1cd10 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
1cd20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1cd30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1cd40 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
1cd50 70 72 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70  pr *pB){.  if( p
1cd60 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20  A==0||pB==0 ){. 
1cd70 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
1cd80 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
1cd90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1cda0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20  AnyProperty(pA, 
1cdb0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1cdc0 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73  Reduced) );.  as
1cdd0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1cde0 79 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  yProperty(pB, EP
1cdf0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1ce00 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20  duced) );.  if( 
1ce10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ce20 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pA, EP_xIsSelect
1ce30 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  ) || ExprHasProp
1ce40 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53  erty(pB, EP_xIsS
1ce50 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
1ce60 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
1ce70 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
1ce80 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
1ce90 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1cea0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
1ceb0 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  2;.  if( pA->op!
1cec0 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
1ced0 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   2;.  if( sqlite
1cee0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
1cef0 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
1cf00 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
1cf10 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1cf20 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
1cf30 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
1cf40 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1cf50 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
1cf60 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
1cf70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
1cf80 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
1cf90 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
1cfa0 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70  =pB->iTable || p
1cfb0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
1cfc0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
1cfd0 20 32 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   2;.  if( ExprHa
1cfe0 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  sProperty(pA, EP
1cff0 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20  _IntValue) ){.  
1d000 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
1d010 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e  operty(pB, EP_In
1d020 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75  tValue) || pA->u
1d030 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69  .iValue!=pB->u.i
1d040 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
1d050 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
1d060 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f   }else if( pA->o
1d070 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
1d080 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
1d090 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1d0a0 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49  roperty(pB, EP_I
1d0b0 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45  ntValue) || NEVE
1d0c0 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d  R(pB->u.zToken==
1d0d0 30 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  0) ) return 2;. 
1d0e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 41     if( strcmp(pA
1d0f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
1d100 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
1d110 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
1d120 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
1d130 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pA->flags & EP_E
1d140 78 70 43 6f 6c 6c 61 74 65 29 21 3d 28 70 42 2d  xpCollate)!=(pB-
1d150 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1d160 6f 6c 6c 61 74 65 29 20 29 20 72 65 74 75 72 6e  ollate) ) return
1d170 20 31 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66   1;.  if( (pA->f
1d180 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
1d190 6c 61 74 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  late)!=0 && pA->
1d1a0 70 43 6f 6c 6c 21 3d 70 42 2d 3e 70 43 6f 6c 6c  pColl!=pB->pColl
1d1b0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 72   ) return 2;.  r
1d1c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1d1d0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78  * Compare two Ex
1d1e0 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20  prList objects. 
1d1f0 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
1d200 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
1d210 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  and .** non-zero
1d220 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
1d230 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
1d240 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
1d250 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ight return non-
1d260 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c  zero for equival
1d270 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20  ent ExprLists.  
1d280 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73  The.** only cons
1d290 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20  equence will be 
1d2a0 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a  disabled optimiz
1d2b0 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69  ations.  But thi
1d2c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73  s routine.** mus
1d2d0 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30  t never return 0
1d2e0 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72   if the two Expr
1d2f0 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65  List objects are
1d300 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a   different, or.*
1d310 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20  * a malfunction 
1d320 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a  will result..**.
1d330 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ** Two NULL poin
1d340 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ters are conside
1d350 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61  red to be the sa
1d360 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20  me.  But a NULL 
1d370 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79  pointer.** alway
1d380 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61  s differs from a
1d390 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65   non-NULL pointe
1d3a0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1d3b0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
1d3c0 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45  (ExprList *pA, E
1d3d0 78 70 72 4c 69 73 74 20 2a 70 42 29 7b 0a 20 20  xprList *pB){.  
1d3e0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
1d3f0 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
1d400 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
1d410 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
1d420 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1d430 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
1d440 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
1d450 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
1d460 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1d470 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
1d480 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
1d490 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1d4a0 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
1d4b0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
1d4c0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
1d4d0 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
1d4e0 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
1d4f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1d500 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
1d510 2c 20 70 45 78 70 72 42 29 20 29 20 72 65 74 75  , pExprB) ) retu
1d520 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1d530 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1d540 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1d550 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
1d560 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
1d570 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1d580 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
1d590 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
1d5a0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1d5b0 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
1d5c0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
1d5d0 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
1d5e0 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
1d5f0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
1d600 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
1d610 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
1d620 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1d630 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
1d640 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
1d650 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
1d660 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
1d670 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
1d680 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
1d690 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
1d6a0 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ColumnAlloc,.   
1d6b0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
1d6c0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
1d6d0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
1d6e0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
1d6f0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
1d700 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
1d710 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1d720 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
1d730 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
1d740 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
1d750 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
1d760 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
1d770 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
1d780 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
1d790 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
1d7a0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
1d7b0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1d7c0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
1d7d0 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
1d7e0 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
1d7f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
1d800 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  c[0]),.       3,
1d810 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
1d820 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70  nFunc,.       &p
1d830 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63  Info->nFuncAlloc
1d840 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
1d850 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
1d860 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
1d870 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
1d880 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
1d890 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
1d8a0 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
1d8b0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
1d8c0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1d8d0 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
1d8e0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1d8f0 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
1d900 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1d910 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1d920 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
1d930 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
1d940 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
1d950 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
1d960 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
1d970 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
1d980 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1d990 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
1d9a0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
1d9b0 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
1d9c0 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
1d9d0 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
1d9e0 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
1d9f0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
1da00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1da10 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
1da20 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1da30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1da40 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
1da50 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1da60 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1da70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1da80 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
1da90 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1daa0 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
1dab0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
1dac0 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
1dad0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
1dae0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
1daf0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
1db00 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
1db10 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
1db20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1db30 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
1db40 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
1db50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
1db60 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1db70 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1db80 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1db90 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
1dba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1dbb0 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
1dbc0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
1dbd0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1dbe0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
1dbf0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
1dc00 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
1dc10 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
1dc20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
1dc30 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
1dc40 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
1dc50 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
1dc60 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
1dc70 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
1dc80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1dc90 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
1dca0 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
1dcb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1dcc0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
1dcd0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
1dce0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
1dcf0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
1dd00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
1dd10 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
1dd20 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1dd30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1dd40 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
1dd50 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
1dd60 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
1dd70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
1dd80 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
1dd90 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
1dda0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
1ddb0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1ddc0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
1ddd0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1ddf0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
1de00 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1de20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1de30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1de40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1de50 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
1de60 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
1de70 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
1de80 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
1de90 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
1dea0 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
1deb0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1dec0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
1ded0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
1dee0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
1def0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
1df00 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
1df10 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1df20 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
1df30 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1df40 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
1df50 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
1df60 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
1df70 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
1df80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1dfa0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1dfb0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
1dfc0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
1dfd0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
1dfe0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
1dff0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
1e000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e010 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1e030 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
1e040 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
1e050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e060 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1e070 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
1e080 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
1e090 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
1e0a0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
1e0b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1e0c0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
1e0d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1e0e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1e0f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1e120 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
1e130 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
1e140 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
1e160 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
1e170 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1e1a0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1e1c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1e1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e1e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e200 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1e210 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
1e220 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1e230 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1e240 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
1e250 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
1e260 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
1e270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e290 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
1e2a0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
1e2b0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
1e2c0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
1e2e0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
1e2f0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
1e300 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
1e310 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
1e320 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
1e330 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
1e340 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
1e350 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
1e360 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
1e370 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
1e380 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
1e390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e3a0 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72 72        ExprSetIrr
1e3b0 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b  educible(pExpr);
1e3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
1e3d0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
1e3e0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
1e3f0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1e400 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
1e410 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1e420 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
1e430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1e440 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1e450 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
1e460 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
1e470 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
1e480 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
1e490 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
1e4a0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
1e4b0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1e4c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e4d0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1e4e0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
1e4f0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
1e500 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72  test causes aggr
1e510 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1e520 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  in subqueries.  
1e530 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e      ** to be ign
1e540 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66  ored */.      if
1e550 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
1e560 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
1e570 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
1e580 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
1e590 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
1e5a0 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
1e5b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
1e5c0 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
1e5d0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
1e5e0 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
1e5f0 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
1e600 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1e610 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
1e620 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
1e630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
1e640 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1e650 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1e660 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e670 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
1e680 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72  em->pExpr, pExpr
1e690 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e6a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e6b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e6c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
1e6d0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
1e6e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1e6f0 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
1e700 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
1e710 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
1e720 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
1e730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1e740 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
1e750 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
1e760 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
1e770 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
1e780 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
1e790 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
1e7a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1e7b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e7c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e7d0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1e7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1e7f0 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
1e800 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
1e810 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
1e820 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1e830 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1e840 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1e850 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
1e860 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e870 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e880 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1e8a0 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
1e8b0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1e8c0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e8f0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
1e900 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
1e910 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
1e920 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
1e930 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
1e940 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
1e950 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
1e960 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1e970 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
1e980 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
1e990 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
1e9a0 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
1e9b0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1e9c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1e9e0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
1e9f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
1ea00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ea10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
1ea20 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
1ea30 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
1ea40 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
1ea50 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
1ea60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ea70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ea80 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
1ea90 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1eaa0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1eab0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49          ExprSetI
1eac0 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72  rreducible(pExpr
1ead0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1eae0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
1eaf0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
1eb00 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
1eb10 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
1eb20 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1eb30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1eb40 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1eb50 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
1eb60 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
1eb70 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
1eb80 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1eb90 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1eba0 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
1ebb0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
1ebc0 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70 4e 43  u.pNC;.  if( pNC
1ebd0 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20  ->nDepth==0 ){. 
1ebe0 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b     pNC->nDepth++
1ebf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
1ec00 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1ec10 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70   pSelect);.    p
1ec20 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20  NC->nDepth--;.  
1ec30 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1ec40 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ne;.  }else{.   
1ec50 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1ec60 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  inue;.  }.}../*.
1ec70 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67  ** Analyze the g
1ec80 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
1ec90 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
1eca0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1ecb0 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
1ecc0 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
1ecd0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
1ece0 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
1ecf0 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20   array..** Make 
1ed00 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
1ed10 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
1ed20 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
1ed30 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
1ed40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ed50 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
1ed60 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
1ed70 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
1ed80 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
1ed90 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
1eda0 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
1edb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1edc0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1edd0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
1ede0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
1edf0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1ee00 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1ee10 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
1ee20 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ate;.  w.xSelect
1ee30 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
1ee40 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
1ee50 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  lect;.  w.u.pNC 
1ee60 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
1ee70 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
1ee80 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
1ee90 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
1eea0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
1eeb0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1eec0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
1eed0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
1eee0 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
1eef0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
1ef00 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1ef10 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
1ef20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
1ef30 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
1ef40 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
1ef50 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
1ef60 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1ef70 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
1ef80 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
1ef90 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
1efa0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1efb0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1efc0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
1efd0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
1efe0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1eff0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1f000 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1f010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
1f020 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1f030 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
1f040 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
1f050 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1f060 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
1f070 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
1f080 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
1f090 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
1f0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
1f0b0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
1f0c0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
1f0d0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
1f0e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f0f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1f100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
1f110 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
1f120 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
1f130 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
1f140 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
1f150 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
1f160 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
1f170 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
1f180 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20   purpose..**.** 
1f190 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
1f1a0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
1f1b0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c   used by the col
1f1c0 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a  umn cache, then.
1f1d0 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69  ** the dallocati
1f1e0 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
1f1f0 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
1f200 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
1f210 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
1f220 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
1f230 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
1f240 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1f250 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
1f260 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
1f270 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
1f280 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
1f290 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
1f2a0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
1f2b0 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
1f2c0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
1f2d0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1f2e0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1f2f0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
1f300 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
1f310 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
1f320 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
1f330 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
1f340 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1f350 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
1f360 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
1f370 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
1f380 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
1f390 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
1f3a0 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
1f3b0 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
1f3c0 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
1f3d0 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
1f3e0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
1f3f0 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
1f400 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
1f410 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
1f420 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
1f430 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
1f440 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
1f450 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
1f460 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
1f470 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
1f480 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
1f490 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
1f4a0 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
1f4b0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
1f4c0 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
1f4d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1f4e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1f4f0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
1f500 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
1f510 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
1f520 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
1f530 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
1f540 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1f550 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
1f560 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f570 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1f580 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
1f590 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
1f5a0 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
1f5b0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
1f5c0 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
1f5d0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
1f5e0 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.