/ Hex Artifact Content
Login

Artifact 4b05c74061e9597f16bea6857b5598a8b5d5be5e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a  e( ALWAYS(p) ){.
0c10: 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
0c20: 70 43 6f 6c 6c 20 3d 20 70 2d 3e 70 43 6f 6c 6c  pColl = p->pColl
0c30: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
0c40: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 70 20  ) break;.    op 
0c50: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
0c60: 20 70 2d 3e 70 54 61 62 21 3d 30 20 26 26 20 28   p->pTab!=0 && (
0c70: 0a 20 20 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f  .        op==TK_
0c80: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
0c90: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  ==TK_COLUMN || o
0ca0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c  p==TK_REGISTER |
0cb0: 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52  | op==TK_TRIGGER
0cc0: 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f  .    )){.      /
0cd0: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
0ce0: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
0cf0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
0d00: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
0d10: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
0d20: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
0d30: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
0d40: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
0d50: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
0d60: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
0d70: 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69   *zColl;.      i
0d80: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
0d90: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
0da0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
0db0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
0dc0: 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 7a  e->db;.        z
0dd0: 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e  Coll = p->pTab->
0de0: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
0df0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
0e00: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
0e10: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
0e20: 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Coll, 0);.      
0e30: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
0e40: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a   pColl;.      }.
0e50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0e60: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54   }.    if( op!=T
0e70: 4b 5f 43 41 53 54 20 26 26 20 6f 70 21 3d 54 4b  K_CAST && op!=TK
0e80: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
0e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0ea0: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
0eb0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
0ec0: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
0ed0: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
0ee0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
0ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
0f00: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  l;.}../*.** pExp
0f10: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
0f20: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
0f30: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
0f40: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
0f50: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
0f60: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
0f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
0f80: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
0f90: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
0fa0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
0fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
0fc0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
0fd0: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
0fe0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
0ff0: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1000: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1010: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1020: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1030: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
1040: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
1050: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
1060: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
1070: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
1080: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
1090: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
10a0: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
10b0: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
10c0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
10d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
10e0: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
10f0: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1100: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1110: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1120: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1150: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  FF_NONE;.    }. 
1160: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
1170: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
1180: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
1190: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
11a0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
11b0: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
11c0: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
11d0: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
11e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
11f0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  FF_NONE;.  }else
1200: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1210: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1220: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1230: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
1240: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
1250: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
1260: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
1270: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1280: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
1290: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
12a0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
12b0: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
12c0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
12d0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
12e0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
12f0: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
1300: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
1310: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
1320: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
1330: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
1340: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
1350: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
1360: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
1370: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
1380: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
1390: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
13a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
13b0: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
13c0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
13d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
13e0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
13f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
1400: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1410: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
1420: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
1430: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1440: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
1450: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1460: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
1470: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
1480: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
1490: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
14a0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
14b0: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
14c0: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
14d0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14e0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14f0: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1500: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1510: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
1520: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
1530: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
1540: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 20   }else if( !aff 
1550: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1560: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1570: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1580: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1590: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
15a0: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
15b0: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
15c0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
15d0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
15e0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
15f0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1600: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1610: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1620: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1630: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1640: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1650: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1660: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1670: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1680: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1690: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
16a0: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
16b0: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
16c0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
16d0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
16e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16f0: 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20  AFF_NONE:.      
1700: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1710: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
1720: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
1730: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
1740: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
1750: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1760: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1770: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1780: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
1790: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
17a0: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
17b0: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
17c0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
17d0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
17e0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
17f0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
1800: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
1810: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
1820: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
1830: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
1840: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
1850: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
1860: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
1870: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
1880: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1890: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
18a0: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
18b0: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
18c0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
18d0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
18e0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
18f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1900: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
1910: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
1920: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1930: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
1940: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1950: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
1960: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
1970: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
1980: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
1990: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
19a0: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
19b0: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
19c0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
19d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
19e0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
19f0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
1a00: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
1a10: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
1a20: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
1a30: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
1a40: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
1a50: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
1a60: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
1a70: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
1a80: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
1a90: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
1aa0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
1ab0: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
1ac0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
1ad0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1ae0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
1af0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
1b00: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
1b10: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
1b20: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
1b30: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
1b40: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
1b50: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1b60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
1b70: 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  eft->pColl );.  
1b80: 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d    pColl = pLeft-
1b90: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20  >pColl;.  }else 
1ba0: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
1bb0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
1bc0: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
1bd0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
1be0: 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t->pColl );.    
1bf0: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
1c00: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pColl;.  }else{.
1c10: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1c20: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1c30: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
1c40: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
1c50: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
1c60: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1c70: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
1c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1c90: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1ca0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cb0: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1cc0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1ce0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1d00: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
1d10: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1d20: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
1d30: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1d40: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1d50: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
1d60: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
1d70: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
1d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
1d90: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
1da0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
1db0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
1dc0: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
1dd0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
1de0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
1df0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
1e00: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
1e10: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
1e20: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
1e30: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
1e40: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
1e50: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
1e60: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
1e70: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
1e80: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
1e90: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1ea0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1eb0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
1ec0: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
1ed0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
1ee0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ef0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1f00: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
1f10: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
1f20: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
1f30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1f50: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
1f60: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
1f70: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
1f80: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
1f90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1fa0: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1fb0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
1fc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
1fd0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67  t argument nHeig
1fe0: 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ht is less than 
1ff0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2000: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65  maximum.** expre
2010: 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f  ssion depth allo
2020: 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  wed. If it is no
2030: 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  t, leave an erro
2040: 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20  r message in.** 
2050: 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  pParse..*/.int s
2060: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
2070: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
2080: 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74  rse, int nHeight
2090: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d  LITE_OK;.  int m
20b0: 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65  xHeight = pParse
20c0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
20d0: 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
20e0: 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65  EPTH];.  if( nHe
20f0: 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b  ight>mxHeight ){
2100: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2110: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
2120: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
2130: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
2140: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
2150: 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74  h %d)", mxHeight
2160: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2170: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2190: 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  }../* The follow
21a0: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
21b0: 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70  ons, heightOfExp
21c0: 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70  r(), heightOfExp
21d0: 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68  rList().** and h
21e0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c  eightOfSelect(),
21f0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
2200: 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d  ermine the maxim
2210: 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20  um height.** of 
2220: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
2230: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  ree referenced b
2240: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
2250: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
2260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
2270: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
2280: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73  aximum height is
2290: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
22a0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
22b0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
22c0: 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73   pnHeight, the s
22d0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
22e0: 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69   then set *pnHei
22f0: 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  ght to that.** v
2300: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2310: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
2320: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
2330: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2340: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2350: 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67  >nHeight>*pnHeig
2360: 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48  ht ){.      *pnH
2370: 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67  eight = p->nHeig
2380: 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
2390: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
23a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70  htOfExprList(Exp
23b0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70  rList *p, int *p
23c0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
23d0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
23e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2400: 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70       heightOfExp
2410: 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  r(p->a[i].pExpr,
2420: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2430: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2440: 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  oid heightOfSele
2450: 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
2460: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
2470: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69  if( p ){.    hei
2480: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
2490: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
24a0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24b0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
24c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24d0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
24e0: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
24f0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2500: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65  p->pOffset, pnHe
2510: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2520: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2530: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
2540: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2550: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
2560: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
2570: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2580: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
2590: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
25a0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
25b0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
25c0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
25d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
25e0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
25f0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
2600: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
2610: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
2620: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
2630: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
2640: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
2650: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
2660: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
2670: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
2680: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
2690: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
26a0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
26b0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
26c0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
26d0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
26e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26f0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
2700: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
2710: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2720: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
2730: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
2740: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2750: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
2760: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
2770: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
2780: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
2790: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
27a0: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
27b0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
27c0: 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  e{.    heightOfE
27d0: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
27e0: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
27f0: 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20   }.  p->nHeight 
2800: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
2810: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2820: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2830: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
2840: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
2850: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
2860: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
2870: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
2880: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
2890: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
28a0: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
28b0: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  or in pParse..*/
28c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
28d0: 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73 65  rSetHeight(Parse
28e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
28f0: 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69  p){.  exprSetHei
2900: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
2910: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2920: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2930: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
2940: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
2950: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2960: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2970: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
2980: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
2990: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
29a0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
29b0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
29c0: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
29d0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
29e0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
29f0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2a00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2a10: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2a20: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65 78  lse.  #define ex
2a30: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
2a40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a50: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2a60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
2a70: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
2a80: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
2a90: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
2aa0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
2ab0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
2ac0: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
2ad0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
2ae0: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
2af0: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
2b00: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
2b10: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
2b20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
2b30: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2b40: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
2b50: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2b60: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
2b70: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2b80: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
2b90: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
2ba0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
2bb0: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
2bc0: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
2bd0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
2be0: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
2bf0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
2c00: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
2c10: 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63 65  g is performance
2c20: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
2c30: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
2c40: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
2c50: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
2c60: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
2c70: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
2c80: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
2c90: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
2ca0: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
2cb0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
2cc0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
2cd0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
2ce0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
2cf0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
2d00: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
2d10: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
2d20: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
2d30: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
2d40: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
2d50: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
2d60: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
2d70: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
2d80: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
2d90: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
2da0: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
2db0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
2dc0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
2dd0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
2de0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
2df0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
2e00: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
2e10: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
2e20: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
2e30: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
2e40: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
2e50: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
2e60: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
2e70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
2e90: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
2ea0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
2eb0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
2ec0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2ee0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
2ef0: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
2f00: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
2f10: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
2f20: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
2f30: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f50: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
2f60: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
2f70: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
2f80: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
2f90: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f   = 0;..  if( pTo
2fa0: 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ken ){.    if( o
2fb0: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
2fc0: 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20   pToken->z==0.  
2fd0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2fe0: 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65  e3GetInt32(pToke
2ff0: 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d  n->z, &iValue)==
3000: 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  0 ){.      nExtr
3010: 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b  a = pToken->n+1;
3020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
3030: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
3040: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3050: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3060: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3070: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
3080: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
3090: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
30a0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
30b0: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
30c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
30d0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
30e0: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
30f0: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
3100: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
3110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
3120: 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70 4e  nt c;.        pN
3130: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
3140: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
3150: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
3160: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  New->u.zToken, p
3170: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
3180: 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ->n);.        pN
3190: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f  ew->u.zToken[pTo
31a0: 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ken->n] = 0;.   
31b0: 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65       if( dequote
31c0: 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20   && nExtra>=3 . 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
31e0: 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  (c = pToken->z[0
31f0: 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27  ])=='\'' || c=='
3200: 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  "' || c=='[' || 
3210: 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20 20  c=='`') ){.     
3220: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
3230: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
3240: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  en);.          i
3250: 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65 77  f( c=='"' ) pNew
3260: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
3270: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
3280: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3290: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
32a0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
32b0: 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d   pNew->nHeight =
32c0: 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d   1;.#endif  .  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
32e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
32f0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
3300: 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a  on node from a z
3310: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74  ero-terminated t
3320: 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a  oken that has.**
3330: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
3340: 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  quoted..*/.Expr 
3350: 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20  *sqlite3Expr(.  
3360: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3370: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
3380: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
3390: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
33a0: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
33b0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
33c0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
33d0: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
33e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f   const char *zTo
33f0: 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ken      /* Toke
3400: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
3410: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
3420: 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e  .  Token x;.  x.
3430: 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e  z = zToken;.  x.
3440: 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c  n = zToken ? sql
3450: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f  ite3Strlen30(zTo
3460: 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  ken) : 0;.  retu
3470: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
3480: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
3490: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
34a0: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
34b0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
34c0: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
34d0: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
34e0: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
34f0: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
3500: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
3510: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
3520: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
3530: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
3540: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
3550: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
3560: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
3570: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
3580: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
3590: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
35a0: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
35b0: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
35c0: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
35d0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
35e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
35f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3600: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
3610: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3620: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
3630: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3640: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
3650: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
3660: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
3670: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 6c    if( pRight->fl
3680: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
3690: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
36a0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
36b0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
36c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f        pRoot->pCo
36d0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
36e0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
36f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
3700: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
3710: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
3720: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
3730: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
3740: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
3750: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
3760: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
3770: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70          pRoot->p
3780: 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43  Coll = pLeft->pC
3790: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
37a0: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
37b0: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
37c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
37d0: 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20 77  te a Expr node w
37e0: 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61  hich joins as ma
37f0: 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65  ny as two subtre
3800: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  es..**.** One or
3810: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62   both of the sub
3820: 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c  trees can be NUL
3830: 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  L.  Return a poi
3840: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
3850: 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f  ** Expr node.  O
3860: 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  r, if an OOM err
3870: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70  or occurs, set p
3880: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
3890: 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65  cFailed,.** free
38a0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e   the subtrees an
38b0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
38c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50  /.Expr *sqlite3P
38d0: 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
38e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
38f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3900: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3930: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
3940: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
3950: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
3960: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
3970: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
3980: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
3990: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
39a0: 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20   *pToken     /* 
39b0: 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a  Argument token *
39c0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  /.){.  Expr *p =
39d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
39e0: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
39f0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3a00: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
3a10: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
3a20: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
3a30: 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 70  pRight);.  if( p
3a40: 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   ) {.    sqlite3
3a50: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
3a60: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
3a70: 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ht);.  }.  retur
3a80: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  n p;.}../*.** Jo
3a90: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
3aa0: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
3ab0: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
3ac0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
3ad0: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
3ae0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
3af0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
3b00: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
3b10: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
3b20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
3b30: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
3b40: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
3b50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3b60: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
3b70: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
3b80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
3b90: 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ft;.  }else{.   
3ba0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
3bb0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
3bc0: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
3be0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
3bf0: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
3c00: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
3c10: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
3c20: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
3c30: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
3c40: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
3c50: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
3c60: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
3c70: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
3c80: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
3c90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
3ca0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
3cb0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
3cc0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
3cd0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3ce0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
3cf0: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
3d00: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
3d10: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
3d20: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
3d30: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
3d40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3d50: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3d60: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
3d70: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
3d80: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
3d90: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
3da0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
3db0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
3dc0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
3dd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
3de0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
3df0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3e00: 53 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65  SetHeight(pParse
3e10: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
3e20: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3e30: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
3e40: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
3e50: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
3e60: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
3e70: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
3e80: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
3e90: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
3ea0: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
3eb0: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
3ec0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
3ed0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
3ee0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
3ef0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
3f00: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
3f10: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
3f20: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
3f30: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
3f40: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
3f50: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
3f60: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
3f70: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
3f80: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
3f90: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
3fa0: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
3fb0: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
3fc0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
3fd0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
3fe0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
3ff0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4000: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4010: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
4020: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4030: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
4040: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
4050: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
4060: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
4070: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
4080: 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c  equenial variabl
4090: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
40a0: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
40b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
40c0: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
40d0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
40e0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74  *pExpr){.  sqlit
40f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4100: 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  >db;.  const cha
4110: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78  r *z;..  if( pEx
4120: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
4130: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
4140: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
4150: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
4160: 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  |EP_Reduced|EP_T
4170: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a  okenOnly) );.  z
4180: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
4190: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21  en;.  assert( z!
41a0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
41b0: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
41c0: 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[1]==0 ){.    
41d0: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
41e0: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
41f0: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
4200: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
4210: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30  .    assert( z[0
4220: 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45  ]=='?' );.    pE
4230: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
4240: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
4250: 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 20  >nVar);.  }else 
4260: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
4270: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
4280: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4290: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
42a0: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
42b0: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
42c0: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
42d0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
42e0: 20 20 69 36 34 20 69 3b 0a 20 20 20 20 69 6e 74    i64 i;.    int
42f0: 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65   bOk = 0==sqlite
4300: 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26  3Atoi64(&z[1], &
4310: 69 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  i, sqlite3Strlen
4320: 33 30 28 26 7a 5b 31 5d 29 2c 20 53 51 4c 49 54  30(&z[1]), SQLIT
4330: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 70 45 78  E_UTF8);.    pEx
4340: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
4350: 6e 56 61 72 29 69 3b 0a 20 20 20 20 74 65 73 74  nVar)i;.    test
4360: 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20  case( i==0 );.  
4370: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
4380: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
4390: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
43a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
43b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
43c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
43d0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
43e0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
43f0: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
4400: 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c      if( bOk==0 |
4410: 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61  | i<1 || i>db->a
4420: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4430: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4440: 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ER] ){.      sql
4450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4460: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
4470: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
4480: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
4490: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  ",.          db-
44a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
44b0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
44c0: 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  MBER]);.    }.  
44d0: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
44e0: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50  nVar ){.      pP
44f0: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e  arse->nVar = (in
4500: 74 29 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t)i;.    }.  }el
4510: 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63  se{.    /* Wildc
4520: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
4530: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
4540: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
4550: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
4560: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
4570: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
4580: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
4590: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
45a0: 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ame.    ** has n
45b0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
45c0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
45d0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
45e0: 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mber.    */.    
45f0: 69 6e 74 20 69 3b 0a 20 20 20 20 75 33 32 20 6e  int i;.    u32 n
4600: 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
4610: 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
4620: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
4630: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
4640: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
4650: 2a 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  *pE = pParse->ap
4660: 56 61 72 45 78 70 72 5b 69 5d 3b 0a 20 20 20 20  VarExpr[i];.    
4670: 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
4680: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  );.      if( mem
4690: 63 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e  cmp(pE->u.zToken
46a0: 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 70 45  , z, n)==0 && pE
46b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d 3d 30  ->u.zToken[n]==0
46c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
46d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 2d  r->iColumn = pE-
46e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
46f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4700: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
4710: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
4720: 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  pr ){.      pExp
4730: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4740: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
4750: 56 61 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Var);.      if( 
4760: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4770: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
4780: 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20  prAlloc-1 ){.   
4790: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
47a0: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50  rExprAlloc += pP
47b0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
47c0: 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  loc + 10;.      
47d0: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
47e0: 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
47f0: 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c    sqlite3DbReall
4800: 6f 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20  ocOrFree(.      
4810: 20 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20          db,.    
4820: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
4830: 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20  ->apVarExpr,.   
4840: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
4850: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
4860: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
4870: 61 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20  apVarExpr[0]).  
4880: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
4890: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
48a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
48b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
48c0: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61  rt( pParse->apVa
48d0: 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  rExpr!=0 );.    
48e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
48f0: 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56  rExpr[pParse->nV
4900: 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70  arExpr++] = pExp
4910: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
4920: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
4930: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
4940: 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c  rse->nVar>db->aL
4950: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4960: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4970: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
4980: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4990: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
49a0: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
49b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
49c0: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
49d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
49e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
49f0: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
4a00: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
4a10: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
4a20: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 45 78  eturn;.  if( !Ex
4a30: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4a40: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
4a50: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4a60: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4a70: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
4a80: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4a90: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
4aa0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
4ab0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
4ac0: 65 64 75 63 65 64 29 20 26 26 20 28 70 2d 3e 66  educed) && (p->f
4ad0: 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c  lags2 & EP2_Mall
4ae0: 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  ocedToken)!=0 ){
4af0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4b00: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
4b10: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oken);.    }.   
4b20: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
4b30: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
4b40: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
4b50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
4b60: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  te(db, p->x.pSel
4b70: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
4b80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4b90: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
4ba0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4bb0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45    }.  }.  if( !E
4bc0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4bd0: 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a  , EP_Static) ){.
4be0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4bf0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
4c00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4c10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
4c20: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
4c30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
4c40: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73  tructure .** pas
4c50: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
4c60: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
4c70: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
4c80: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a   EXPR_FULLSIZE,.
4c90: 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  ** EXPR_REDUCEDS
4ca0: 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45  IZE or EXPR_TOKE
4cb0: 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74  NONLYSIZE..*/.st
4cc0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72  atic int exprStr
4cd0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29  uctSize(Expr *p)
4ce0: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  {.  if( ExprHasP
4cf0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
4d00: 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  kenOnly) ) retur
4d10: 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  n EXPR_TOKENONLY
4d20: 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72  SIZE;.  if( Expr
4d30: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4d40: 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74  P_Reduced) ) ret
4d50: 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44  urn EXPR_REDUCED
4d60: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45  SIZE;.  return E
4d70: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a  XPR_FULLSIZE;.}.
4d80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
4d90: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
4da0: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
4db0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4dc0: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
4dd0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
4de0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
4df0: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
4e00: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
4e10: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
4e20: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
4e30: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
4e40: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
4e50: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
4e60: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
4e70: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
4e80: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
4e90: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
4ea0: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
4eb0: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
4ec0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
4ed0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
4ee0: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
4ef0: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
4f00: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
4f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f50: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
4f60: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
4f70: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
4f80: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
4f90: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
4fa0: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
4fb0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
4fc0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
4fd0: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
4fe0: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
4ff0: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
5000: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
5010: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
5020: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
5030: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5040: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
5050: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
5060: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
5070: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
5080: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
5090: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
50a0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
50b0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
50c0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
50d0: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
50e0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
50f0: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
5100: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
5110: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
5120: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
5130: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
5140: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
5150: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
5160: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
5170: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
5180: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
5190: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
51a0: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
51b0: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
51c0: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
51d0: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
51e0: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
51f0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
5200: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
5210: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
5220: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
5230: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
5240: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
5250: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
5260: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
5270: 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62  s of teh Expr ob
5280: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
5290: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
52a0: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
52b0: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
52c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
52d0: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
52e0: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
52f0: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
5300: 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52 45 44  ke a EXPRDUP_RED
5310: 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65  UCE copy of a re
5320: 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e  duced expression
5330: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65  .  It is only le
5340: 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65  gal.** to reduce
5350: 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72   a pristine expr
5360: 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d  ession tree from
5370: 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68   the parser.  Th
5380: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
5390: 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72  .** of dupedExpr
53a0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e  StructSize() con
53b0: 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73  tain multiple as
53c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
53d0: 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a  s that attempt.*
53e0: 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69  * to enforce thi
53f0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f  s constraint..*/
5400: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
5410: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5420: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
5430: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65  gs){.  int nSize
5440: 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
5450: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5460: 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b  E || flags==0 );
5470: 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61   /* Only one fla
5480: 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20  g value allowed 
5490: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61  */.  if( 0==(fla
54a0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
54b0: 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  E) ){.    nSize 
54c0: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
54d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
54e0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
54f0: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
5500: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
5510: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73  uced) );.    ass
5520: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5530: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
5540: 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73  Join) ); .    as
5550: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32  sert( (p->flags2
5560: 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54   & EP2_MallocedT
5570: 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  oken)==0 );.    
5580: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
5590: 73 32 20 26 20 45 50 32 5f 49 72 72 65 64 75 63  s2 & EP2_Irreduc
55a0: 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ible)==0 );.    
55b0: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
55c0: 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e  p->pRight || p->
55d0: 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70 4c  pColl || p->x.pL
55e0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ist ){.      nSi
55f0: 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45  ze = EXPR_REDUCE
5600: 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63  DSIZE | EP_Reduc
5610: 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ed;.    }else{. 
5620: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
5630: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
5640: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
5650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5660: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
5670: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5680: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
5690: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
56a0: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
56b0: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
56c0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
56d0: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
56e0: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
56f0: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
5700: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
5710: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
5720: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
5730: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
5740: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
5750: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
5760: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
5770: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
5780: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
5790: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
57a0: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
57b0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
57c0: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
57d0: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
57e0: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
57f0: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
5800: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
5810: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5820: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
5830: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
5840: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
5850: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
5860: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5870: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
5880: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
5890: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
58a0: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
58b0: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
58c0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
58d0: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
58e0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
58f0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
5900: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
5910: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
5920: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
5930: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
5940: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
5950: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
5960: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
5970: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
5980: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
5990: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
59a0: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
59b0: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
59c0: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
59d0: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
59e0: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
59f0: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
5a00: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
5a10: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
5a20: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
5a30: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5a40: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
5a50: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
5a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
5a70: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
5a80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5a90: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
5aa0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
5ab0: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
5ac0: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
5ad0: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
5ae0: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
5af0: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
5b00: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
5b10: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
5b20: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
5b30: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
5b40: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
5b50: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
5b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5b70: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
5b80: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
5b90: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
5ba0: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
5bb0: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
5bc0: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
5bd0: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
5be0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
5bf0: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
5c00: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
5c10: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
5c20: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
5c30: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
5c40: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
5c50: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
5c60: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
5c70: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
5c80: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
5c90: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
5ca0: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
5cb0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
5cc0: 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20  rst byte passed 
5cd0: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
5ce0: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
5cf0: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
5d00: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
5d10: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
5d20: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
5d30: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
5d40: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
5d50: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
5d60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
5d80: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
5d90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5da0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75  const int isRedu
5db0: 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50  ced = (flags&EXP
5dc0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
5dd0: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20    u8 *zAlloc;.  
5de0: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
5df0: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
5e00: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
5e10: 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a  | isReduced );..
5e20: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
5e30: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
5e40: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
5e50: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
5e60: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
5e70: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a        zAlloc = *
5e80: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  pzBuffer;.      
5e90: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
5ea0: 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73  Static;.    }els
5eb0: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
5ec0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5ed0: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
5ee0: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
5ef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
5f00: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
5f10: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
5f20: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
5f30: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
5f40: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
5f50: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
5f60: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
5f70: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
5f80: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
5f90: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
5fa0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
5fb0: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
5fc0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
5fd0: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
5fe0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5ff0: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
6000: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
6010: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
6020: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6030: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
6040: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
6050: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
6060: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
6070: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
6080: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
6090: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
60a0: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
60b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
60c0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  n;.      if( !Ex
60d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
60e0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
60f0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
6100: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6110: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6120: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
6130: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
6140: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6150: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6160: 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20    if( isReduced 
6170: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6180: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
6190: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
61a0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
61b0: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
61c0: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
61d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
61e0: 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78    int nSize = ex
61f0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
6200: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6210: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
6220: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
6230: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
6240: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
6250: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
6260: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
6270: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
6280: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
6290: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
62a0: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
62b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
62c0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
62d0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
62e0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b 0a  nly|EP_Static);.
62f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
6300: 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  s |= nStructSize
6310: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
6320: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20  P_TokenOnly);.  
6330: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6340: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
6350: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
6360: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
6370: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
6380: 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  .      if( nToke
6390: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  n ){.        cha
63a0: 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77  r *zToken = pNew
63b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
63c0: 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77  ar*)&zAlloc[nNew
63d0: 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d  Size];.        m
63e0: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
63f0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
6400: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  n);.      }..   
6410: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
6420: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
6430: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
6440: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
6450: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77  Fill in the pNew
6460: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70  ->x.pSelect or p
6470: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d  New->x.pList mem
6480: 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ber. */.        
6490: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
64a0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
64b0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
64c0: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
64d0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
64e0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
64f0: 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65 64  elect, isReduced
6500: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
6510: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6520: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
6530: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6540: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  b, p->x.pList, i
6550: 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20  sReduced);.     
6560: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6570: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70      /* Fill in p
6580: 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  New->pLeft and p
6590: 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a  New->pRight. */.
65a0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
65b0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e 65  sAnyProperty(pNe
65c0: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
65d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
65e0: 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d         zAlloc +=
65f0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
6600: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
6610: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
6620: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
6630: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
6640: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
6650: 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64  Left = exprDup(d
6660: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
6670: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
6680: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
6690: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
66a0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
66b0: 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52  Right, EXPRDUP_R
66c0: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
66d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
66e0: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
66f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a  ){.          *pz
6700: 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b  Buffer = zAlloc;
6710: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6730: 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20 30  pNew->flags2 = 0
6740: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45  ;.        if( !E
6750: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
6760: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
6770: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
6780: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
6790: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
67a0: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
67b0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
67c0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
67d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
67e0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
67f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
6800: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6810: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pNew;.}../*.** T
6820: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
6830: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
6840: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
6850: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
6860: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
6870: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
6880: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
6890: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
68a0: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
68b0: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
68c0: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
68d0: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
68e0: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
68f0: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
6900: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
6910: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
6920: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
6930: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
6940: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
6950: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6960: 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c  ),.** sqlite3IdL
6970: 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71  istDup(), and sq
6980: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
6990: 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72  ) can not be fur
69a0: 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a  ther expanded .*
69b0: 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  * by subsequent 
69c0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a  calls to sqlite*
69d0: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75  ListAppend() rou
69e0: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  tines..**.** Any
69f0: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
6a00: 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70   SrcList might p
6a10: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
6a20: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a  duplicated..**.*
6a30: 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61  * The flags para
6a40: 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61  meter contains a
6a50: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
6a60: 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20  the EXPRDUP_XXX 
6a70: 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65  flags..** If the
6a80: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
6a90: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
6aa0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
6ab0: 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a  returned is a.**
6ac0: 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69   truncated versi
6ad0: 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  on of the usual 
6ae0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74  Expr structure t
6af0: 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
6b00: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
6b10: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
6b20: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
6b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
6b40: 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  hema..*/.Expr *s
6b50: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71  qlite3ExprDup(sq
6b60: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
6b70: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6b80: 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75 70    return exprDup
6b90: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
6ba0: 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  );.}.ExprList *s
6bb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6bc0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
6bd0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
6be0: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
6bf0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
6c00: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
6c10: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
6c20: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
6c30: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
6c40: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
6c50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
6c60: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
6c70: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
6c80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6c90: 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20   pNew->iECursor 
6ca0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  = 0;.  pNew->nEx
6cb0: 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  pr = pNew->nAllo
6cc0: 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  c = p->nExpr;.  
6cd0: 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20  pNew->a = pItem 
6ce0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6cf0: 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78  cRaw(db,  p->nEx
6d00: 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  pr*sizeof(p->a[0
6d10: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  ]) );.  if( pIte
6d20: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
6d30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
6d40: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
6d50: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
6d60: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
6d70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
6d80: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
6d90: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
6da0: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
6db0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
6dc0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
6dd0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
6de0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70  rDup(db, pOldExp
6df0: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  r, flags);.    p
6e00: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
6e10: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6e20: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
6e30: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
6e40: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
6e50: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
6e60: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
6e70: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
6e80: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
6e90: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
6ea0: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
6eb0: 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20    pItem->iCol = 
6ec0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a  pOldItem->iCol;.
6ed0: 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61      pItem->iAlia
6ee0: 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41  s = pOldItem->iA
6ef0: 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lias;.  }.  retu
6f00: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
6f10: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
6f20: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
6f30: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
6f40: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
6f50: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
6f60: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
6f70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
6f80: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
6f90: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
6fa0: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
6fb0: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
6fc0: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
6fd0: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
6fe0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
6ff0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
7000: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7010: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
7020: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7030: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
7040: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7050: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
7060: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
7070: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
7080: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
7090: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
70a0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
70b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
70c0: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  Byte;.  if( p==0
70d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
70e0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
70f0: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
7100: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
7110: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
7120: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
7130: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7140: 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
7150: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7160: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7170: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
7180: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
7190: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
71a0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
71b0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
71c0: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
71d0: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
71e0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
71f0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
7200: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61  &p->a[i];.    Ta
7210: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
7220: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
7230: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
7240: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7250: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
7260: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
7270: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7280: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7290: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
72a0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
72b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
72c0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
72d0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
72e0: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
72f0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
7300: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
7310: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
7320: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
7330: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
7340: 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c  sPopulated = pOl
7350: 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  dItem->isPopulat
7360: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
7370: 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->zIndex = sqlit
7380: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7390: 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  OldItem->zIndex)
73a0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
73b0: 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c  notIndexed = pOl
73c0: 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  dItem->notIndexe
73d0: 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  d;.    pNewItem-
73e0: 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74  >pIndex = pOldIt
73f0: 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  em->pIndex;.    
7400: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
7410: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
7420: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
7430: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
7440: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
7450: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
7460: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7470: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
7480: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
7490: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
74a0: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
74b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
74c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20   pOldItem->pOn, 
74d0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
74e0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
74f0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
7500: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  db, pOldItem->pU
7510: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
7520: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
7530: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
7540: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7550: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
7560: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
7570: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
7580: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
7590: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
75a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
75b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
75c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
75d0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
75e0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
75f0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7600: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
7610: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
7620: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
7630: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
7640: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e  llocRaw(db, p->n
7650: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
7660: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
7670: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
7680: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7690: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
76a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
76b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
76c0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
76d0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
76e0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
76f0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
7700: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
7710: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
7720: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
7730: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7740: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7750: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
7760: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
7770: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
7780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7790: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
77a0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
77b0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
77c0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
77d0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
77e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
77f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
7800: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7810: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
7820: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
7830: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7840: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
7850: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7860: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
7870: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  st, flags);.  pN
7880: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
7890: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
78a0: 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29   p->pSrc, flags)
78b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
78c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
78d0: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
78e0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
78f0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
7900: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7910: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
7920: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7930: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
7940: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7950: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
7960: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
7970: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
7980: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
7990: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
79a0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
79b0: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
79c0: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
79d0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72  ctDup(db, p->pPr
79e0: 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ior, flags);.  p
79f0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
7a00: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7a10: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
7a20: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  s);.  pNew->pOff
7a30: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
7a40: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
7a50: 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  set, flags);.  p
7a60: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
7a70: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
7a80: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65   = 0;.  pNew->se
7a90: 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46  lFlags = p->selF
7aa0: 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45  lags & ~SF_UsesE
7ab0: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77  phemeral;.  pNew
7ac0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
7ad0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
7ae0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
7af0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7b00: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
7b10: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
7b20: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65  hm[2] = -1;.  re
7b30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
7b40: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
7b50: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
7b60: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
7b70: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7b80: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
7b90: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
7ba0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
7bb0: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
7bc0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
7bd0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
7be0: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
7bf0: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
7c00: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
7c10: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
7c20: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  list..**.** If a
7c30: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
7c40: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
7c50: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
7c60: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
7c70: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
7c80: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
7c90: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
7ca0: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
7cb0: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
7cc0: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
7cd0: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
7ce0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
7cf0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
7d00: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
7d10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
7d20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7d30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
7d40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
7d50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
7d60: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
7d70: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
7d80: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
7d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
7da0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
7db0: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
7dc0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
7dd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7de0: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
7df0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
7e00: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
7e10: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7e20: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
7e30: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
7e40: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
7e50: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
7e60: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
7e70: 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  >nAlloc==0 );.  
7e80: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
7e90: 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45  Alloc<=pList->nE
7ea0: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
7eb0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
7ec0: 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  *a;.    int n = 
7ed0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
7ee0: 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 4;.    a = sql
7ef0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
7f00: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  , pList->a, n*si
7f10: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
7f20: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
7f30: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
7f40: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
7f50: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
7f60: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
7f70: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7f80: 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69  ocSize(db, a)/si
7f90: 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a  zeof(a[0]);.  }.
7fa0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
7fb0: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31  >a!=0 );.  if( 1
7fc0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
7fd0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
7fe0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
7ff0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
8000: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
8010: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  m, 0, sizeof(*pI
8020: 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d  tem));.    pItem
8030: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
8040: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
8050: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
8060: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
8070: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
8080: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
8090: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
80a0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
80b0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
80c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
80d0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
80e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
80f0: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
8100: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
8110: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
8120: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
8130: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8140: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8150: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8160: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8170: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8180: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
8190: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
81a0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
81b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
81c0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
81d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
81e0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
81f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8200: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
8210: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8220: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
8230: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8240: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8250: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
8260: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
8270: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
8280: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
8290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
82a0: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
82b0: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
82c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
82d0: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
82e0: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
82f0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
8300: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
8310: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8320: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
8330: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
8340: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8350: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
8360: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8370: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
8380: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
8390: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
83a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
83b0: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
83c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
83d0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
83e0: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
83f0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
8400: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
8410: 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e  quote && pItem->
8420: 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44  zName ) sqlite3D
8430: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
8440: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
8450: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
8460: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
8470: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
8480: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8490: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
84a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
84b0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
84c0: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
84d0: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
84e0: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
84f0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
8500: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
8510: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
8520: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
8530: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8540: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
8550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8560: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
8570: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
8580: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8590: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
85a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
85b0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
85c0: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
85d0: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
85e0: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
85f0: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
8600: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
8610: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
8620: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8630: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
8640: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
8650: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
8660: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
8670: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8680: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8690: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
86a0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
86b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
86c0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
86d0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
86e0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
86f0: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
8700: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
8710: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8720: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8730: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
8740: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
8750: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
8760: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
87a0: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
87b0: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
87c0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
87d0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
87e0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
87f0: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
8800: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
8810: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8820: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
8830: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8840: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
8850: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
8860: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8870: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
8880: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
8890: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
88a0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
88b0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
88c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
88d0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
88e0: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
88f0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
8900: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
8910: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
8920: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
8930: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
8940: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8950: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8960: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
8970: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
8980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
8990: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
89a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
89b0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
89c0: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
89d0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
89e0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
89f0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
8a00: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
8a10: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
8a20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8a30: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
8a40: 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  || (pList->nExpr
8a50: 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41  ==0 && pList->nA
8a60: 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73  lloc==0) );.  as
8a70: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
8a80: 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  pr<=pList->nAllo
8a90: 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  c );.  for(pItem
8aa0: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
8ab0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
8ac0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
8ad0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
8ae0: 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
8af0: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
8b00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
8b10: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
8b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8b30: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
8b40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
8b50: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
8b60: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
8b70: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
8b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
8b90: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
8ba0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20  ker callbacks.  
8bb0: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61  Walker.u.pi is a
8bc0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
8bd0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73  n integer.  Thes
8be0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  e routines are c
8bf0: 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65  hecking an expre
8c00: 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20  ssion to see.** 
8c10: 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74  if it is a const
8c20: 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65  ant.  Set *Walke
8c30: 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74  r.u.pi to 0 if t
8c40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8c50: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74  .** not constant
8c60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
8c70: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
8c80: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
8c90: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
8ca0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
8cb0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
8cc0: 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71  tant().**     sq
8cd0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
8ce0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20  antNotJoin().** 
8cf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
8d00: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
8d10: 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ion().**.*/.stat
8d20: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
8d30: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
8d40: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
8d50: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
8d60: 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69  f pWalker->u.i i
8d70: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
8d80: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
8d90: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
8da0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
8db0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
8dc0: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
8dd0: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
8de0: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
8df0: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
8e00: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
8e10: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
8e20: 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 41  i==3 && ExprHasA
8e30: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
8e40: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
8e50: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75  {.    pWalker->u
8e60: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  .i = 0;.    retu
8e70: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
8e80: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
8e90: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
8ea0: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
8eb0: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
8ec0: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
8ed0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
8ee0: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
8ef0: 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  d pWalker->u.i==
8f00: 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  2 */.    case TK
8f10: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
8f20: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
8f30: 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b  i==2 ) return 0;
8f40: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
8f50: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
8f60: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
8f70: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
8f80: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
8f90: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
8fa0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
8fb0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8fc0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
8fd0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8fe0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8ff0: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
9000: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
9010: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
9020: 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
9030: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9040: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
9050: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c  MN );.      pWal
9060: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
9070: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
9080: 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c  bort;.    defaul
9090: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
90a0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
90b0: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
90c0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
90d0: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
90e0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
90f0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9100: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
9110: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
9120: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
9130: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
9140: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
9150: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
9160: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
9170: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
9180: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
9190: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
91a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
91b0: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
91c0: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75  >u.i = 0;.  retu
91d0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
91e0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
91f0: 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20  sConst(Expr *p, 
9200: 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20  int initFlag){. 
9210: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75   Walker w;.  w.u
9220: 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  .i = initFlag;. 
9230: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
9240: 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
9250: 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
9260: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
9270: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9280: 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  t;.  sqlite3Walk
9290: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
92a0: 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a  eturn w.u.i;.}..
92b0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
92c0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
92d0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
92e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
92f0: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
9300: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
9310: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
9320: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
9330: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
9340: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
9350: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
9360: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9370: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
9380: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9390: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
93a0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
93b0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
93c0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
93d0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
93e0: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
93f0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
9400: 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a  rIsConst(p, 1);.
9410: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
9420: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9430: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
9440: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9450: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
9460: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
9470: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
9480: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
9490: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
94a0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
94b0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
94c0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
94d0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
94e0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
94f0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
9500: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9510: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
9520: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
9530: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
9540: 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   3);.}../*.** Wa
9550: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
9560: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
9570: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
9580: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
9590: 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
95a0: 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
95b0: 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
95c0: 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
95d0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
95e0: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
95f0: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
9600: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
9610: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
9620: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
9630: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
9640: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
9650: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
9660: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
9670: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
9680: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
9690: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
96a0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
96b0: 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  on(Expr *p){.  r
96c0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
96d0: 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 2);.}../*.*
96e0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
96f0: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
9700: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
9710: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
9720: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
9730: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
9740: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
9750: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
9760: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
9770: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
9780: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9790: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
97a0: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
97b0: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
97c0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
97d0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
97e0: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
97f0: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
9800: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9810: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
9820: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
9830: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
9840: 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ;.  if( p->flags
9850: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
9860: 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
9870: 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
9880: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9890: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
98a0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
98b0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
98c0: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49 6e  c = sqlite3GetIn
98d0: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
98e0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
98f0: 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
9900: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9910: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9920: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
9930: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
9940: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
9950: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
9960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9970: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
9980: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
9990: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
99a0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
99b0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
99c0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  {.        *pValu
99d0: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
99e0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
99f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9a00: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
9a10: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
9a20: 20 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72   rc ){.    asser
9a30: 74 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  t( ExprHasAnyPro
9a40: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
9a50: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
9a60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
9a70: 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 32 20 26   || (p->flags2 &
9a80: 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b   EP2_MallocedTok
9a90: 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  en)==0 );.    p-
9aa0: 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  >op = TK_INTEGER
9ab0: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  ;.    p->flags |
9ac0: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
9ad0: 20 20 20 70 2d 3e 75 2e 69 56 61 6c 75 65 20 3d     p->u.iValue =
9ae0: 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20   *pValue;.  }.  
9af0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9b00: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
9b10: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
9b20: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
9b30: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
9b40: 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
9b50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9b60: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
9b70: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
9b80: 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
9b90: 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
9ba0: 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
9bb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9bc0: 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
9bd0: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
9be0: 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
9bf0: 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
9c00: 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
9c10: 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
9c20: 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
9c30: 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
9c40: 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
9c50: 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
9c60: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
9c70: 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
9c80: 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
9c90: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
9ca0: 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
9cb0: 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
9cc0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
9cd0: 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
9ce0: 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
9cf0: 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
9d00: 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
9d10: 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
9d20: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
9d30: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
9d40: 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
9d50: 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
9d60: 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
9d70: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
9d80: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
9d90: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
9da0: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
9db0: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
9dc0: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
9dd0: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
9de0: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
9df0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
9e00: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
9e10: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
9e20: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
9e30: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
9e40: 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
9e50: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
9e60: 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
9e70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64   return 0;.    d
9e80: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
9e90: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
9ea0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
9eb0: 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74 72   OP_IsNull instr
9ec0: 75 63 74 69 6f 6e 20 74 68 61 74 20 74 65 73 74  uction that test
9ed0: 73 20 72 65 67 69 73 74 65 72 20 69 52 65 67 20  s register iReg 
9ee0: 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20  and jumps.** to 
9ef0: 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73 74 20 69  location iDest i
9f00: 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69  f the value in i
9f10: 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68  Reg is NULL.  Th
9f20: 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20  e value in iReg 
9f30: 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75 74 65 64  .** was computed
9f40: 20 62 79 20 70 45 78 70 72 2e 20 20 49 66 20 77   by pExpr.  If w
9f50: 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70 45  e can look at pE
9f60: 78 70 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  xpr at compile-t
9f70: 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65 72  ime and.** deter
9f80: 6d 69 6e 65 20 74 68 61 74 20 69 74 20 63 61 6e  mine that it can
9f90: 20 6e 65 76 65 72 20 67 65 6e 65 72 61 74 65 20   never generate 
9fa0: 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  a NULL, then the
9fb0: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72 61   OP_IsNull opera
9fc0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
9fd0: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
9fe0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
9ff0: 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64 62  sNullJump(.  Vdb
a000: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
a010: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
a020: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
a030: 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 20  */.  const Expr 
a040: 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79  *pExpr,  /* Only
a050: 20 67 65 6e 65 72 61 74 65 20 4f 50 5f 49 73 4e   generate OP_IsN
a060: 75 6c 6c 20 69 66 20 74 68 69 73 20 65 78 70 72  ull if this expr
a070: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   can be NULL */.
a080: 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
a090: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
a0a0: 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  e value in this 
a0b0: 72 65 67 69 73 74 65 72 20 66 6f 72 20 4e 55 4c  register for NUL
a0c0: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73 74  L */.  int iDest
a0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a0e0: 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 76  mp here if the v
a0f0: 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a  alue is null */.
a100: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
a110: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
a120: 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
a130: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a140: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
a150: 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , iDest);.  }.}.
a160: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
a170: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
a180: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
a190: 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77  constant which w
a1a0: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61  ould be.** uncha
a1b0: 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e  nged by OP_Affin
a1c0: 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66  ity with the aff
a1d0: 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74  inity given in t
a1e0: 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
a1f0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ument..**.** Thi
a200: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
a210: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
a220: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
a230: 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  y operation.** c
a240: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20  an be omitted.  
a250: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65  When in doubt re
a260: 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66  turn FALSE.  A f
a270: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a  alse negative.**
a280: 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41   is harmless.  A
a290: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c   false positive,
a2a0: 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65   however, can re
a2b0: 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  sult in the wron
a2c0: 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a  g.** answer..*/.
a2d0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e  int sqlite3ExprN
a2e0: 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
a2f0: 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20  ange(const Expr 
a300: 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20  *p, char aff){. 
a310: 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66   u8 op;.  if( af
a320: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f==SQLITE_AFF_NO
a330: 4e 45 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  NE ) return 1;. 
a340: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
a350: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
a360: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
a370: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
a380: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
a390: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
a3a0: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
a3b0: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
a3c0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
a3d0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
a3e0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
a3f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
a400: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a410: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
a420: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
a430: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
a440: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
a450: 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53  F_REAL || aff==S
a460: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
a470: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
a480: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
a490: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
a4a0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
a4b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a4c0: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
a4d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a4e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
a4f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73  LUMN: {.      as
a500: 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e  sert( p->iTable>
a510: 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e  =0 );  /* p cann
a520: 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20  ot be part of a 
a530: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
a540: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
a550: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20   p->iColumn<0.  
a560: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
a570: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
a580: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
a590: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b  TE_AFF_NUMERIC);
a5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a5b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lt: {.      retu
a5c0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
a5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a5e0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
a5f0: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
a600: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
a610: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a620: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
a630: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
a640: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
a650: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
a660: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
a670: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
a680: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
a690: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
a6a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
a6b0: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
a6c0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
a6d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
a6e0: 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 61  urn true if we a
a6f0: 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49  re able to the I
a700: 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d  N operator optim
a710: 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20  ization on a.** 
a720: 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
a730: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20  m.**.**       x 
a740: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
a750: 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20  **.** Where the 
a760: 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65  SELECT... clause
a770: 20 69 73 20 61 73 20 73 70 65 63 69 66 69 65 64   is as specified
a780: 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65   by the paramete
a790: 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75  r to this.** rou
a7a0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
a7b0: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61  Select object pa
a7c0: 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65  ssed in has alre
a7d0: 61 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63  ady been preproc
a7e0: 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20  essed and no.** 
a7f0: 65 72 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e  errors have been
a800: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64   found..*/.#ifnd
a810: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
a820: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 69  UBQUERY.static i
a830: 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  nt isCandidateFo
a840: 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70  rInOpt(Select *p
a850: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
a860: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
a870: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
a880: 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d  *pTab;.  if( p==
a890: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  /* right-hand si
a8c0: 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45  de of IN is SELE
a8d0: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  CT */.  if( p->p
a8e0: 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
a8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a900: 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  * Not a compound
a910: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
a920: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
a930: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
a940: 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
a950: 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
a960: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
a970: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
a980: 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
a990: 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ct );.    testca
a9a0: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
a9b0: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
a9c0: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
a9d0: 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
a9e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
a9f0: 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
aa00: 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72  word and no aggr
aa10: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
aa20: 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  */.  }.  assert(
aa30: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
aa40: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
aa50: 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
aa60: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
aa70: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
aa80: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
aa90: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
aaa0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
aab0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
aac0: 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  fset==0 );      
aad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c           /* No L
aae0: 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46  IMIT means no OF
aaf0: 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  FSET */.  if( p-
ab00: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
ab10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ab20: 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
ab30: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
ab40: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
ab50: 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
ab60: 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
ab70: 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
ab80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
ab90: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
aba0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
abb0: 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
abc0: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
abd0: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20       /* FROM is 
abe0: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f  not a subquery o
abf0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62  r view */.  pTab
ac00: 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
ac10: 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  ab;.  if( NEVER(
ac20: 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72  pTab==0) ) retur
ac30: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
ac40: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
ac50: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
ac60: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
ac70: 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
ac80: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
ac90: 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
aca0: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
acb0: 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
acc0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
acd0: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
ace0: 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  t;.  if( pEList-
acf0: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
ad00: 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f  rn 0;       /* O
ad10: 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ne column in the
ad20: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
ad30: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
ad40: 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
ad50: 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
ad60: 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20  0; /* Result is 
ad70: 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65  a column */.  re
ad80: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
ad90: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ada0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
adb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
adc0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
add0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
ade0: 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
adf0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73  perator..** It's
ae00: 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64 20   job is to find 
ae10: 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
ae20: 65 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ee structure tha
ae30: 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a 2a  t may be used.**
ae40: 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
ae50: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 6f  for membership o
ae60: 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 20  f the (...) set 
ae70: 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
ae80: 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d  rough.** its mem
ae90: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 64  bers, skipping d
aea0: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
aeb0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
aec0: 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  e cursor opened 
aed0: 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 28 64  on the b-tree (d
aee0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 64  atabase table, d
aef0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a 2a  atabase index .*
af00: 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74 61  * or ephermal ta
af10: 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20 69  ble) is stored i
af20: 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65 66  n pX->iTable bef
af30: 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
af40: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68  n returns..** Th
af50: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
af60: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
af70: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
af80: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
af90: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
afa0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
afb0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
afc0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
afd0: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
afe0: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
aff0: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
b000: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
b010: 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a  tabase index..**
b020: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
b030: 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77  -   The cursor w
b040: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
b050: 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
b060: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
b070: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
b080: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
b090: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  able..**.** An e
b0a0: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
b0b0: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
b0c0: 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
b0d0: 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a   of the simple.*
b0e0: 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  * form:.**.**   
b0f0: 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
b100: 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  > FROM <table>.*
b110: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
b120: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
b130: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20   is 0, then the 
b140: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
b150: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
b160: 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
b170: 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70  t members, skipp
b180: 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ing any duplicat
b190: 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  es. In this case
b1a0: 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c   an.** epheremal
b1b0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
b1c0: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
b1d0: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
b1e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
b1f0: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
b200: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
b210: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
b220: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
b230: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
b240: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
b250: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
b260: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
b270: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
b280: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
b290: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
b2a0: 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
b2b0: 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
b2c0: 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68  hip tests. In th
b2d0: 69 73 20 63 61 73 65 20 61 6e 20 65 70 68 65 72  is case an epher
b2e0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
b2f0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
b300: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
b310: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
b320: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
b330: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
b340: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
b350: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
b360: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
b370: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
b380: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
b390: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
b3a0: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
b3b0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64  function.** need
b3c0: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  s to know whethe
b3d0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72  r or not the str
b3e0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
b3f0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20  an SQL NULL .** 
b400: 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74  value in order t
b410: 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c  o correctly eval
b420: 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  uate expressions
b430: 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20   like "X IN (Y, 
b440: 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65  Z)"..** If there
b450: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
b460: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
b470: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
b480: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
b490: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
b4a0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
b4b0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
b4c0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
b4d0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f  tten.** to *prNo
b4e0: 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65  tFound. If there
b4f0: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
b500: 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
b510: 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
b520: 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e  value, then *prN
b530: 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20  otFound is left 
b540: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
b550: 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
b560: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
b570: 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
b580: 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75  red in *prNotFou
b590: 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20  nd, then.** its 
b5a0: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73  initial value is
b5b0: 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28   NULL.  If the (
b5c0: 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65  ...) does not re
b5d0: 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  main constant.**
b5e0: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
b5f0: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28  n of the query (
b600: 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20  i.e. the SELECT 
b610: 77 69 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29  within the (...)
b620: 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61  .** is a correla
b630: 74 65 64 20 73 75 62 71 75 65 72 79 29 20 74 68  ted subquery) th
b640: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
b650: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65  the allocated re
b660: 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73  gister is.** res
b670: 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20  et to NULL each 
b680: 74 69 6d 65 20 74 68 65 20 73 75 62 71 75 65 72  time the subquer
b690: 79 20 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73  y is rerun. This
b6a0: 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63   allows the.** c
b6b0: 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62  aller to use vdb
b6c0: 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e  e code equivalen
b6d0: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
b6e0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  ng:.**.**   if( 
b6f0: 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29  register==NULL )
b700: 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c  {.**     has_nul
b710: 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74  l = <test if dat
b720: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
b730: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20  ains null>.**   
b740: 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a    register = 1.*
b750: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f  *   }.**.** in o
b760: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75  rder to avoid ru
b770: 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20  nning the <test 
b780: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
b790: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
b7a0: 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66  .** test more of
b7b0: 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65  ten than is nece
b7c0: 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ssary..*/.#ifnde
b7d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
b7e0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
b7f0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
b800: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
b810: 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f  r *pX, int *prNo
b820: 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63  tFound){.  Selec
b830: 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
b860: 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
b870: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
b880: 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
b8b0: 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
b8c0: 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
b8d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
b8e0: 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
b8f0: 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
b900: 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
b910: 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d  t mustBeUnique =
b920: 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29   (prNotFound==0)
b930: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52  ;   /* True if R
b940: 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
b950: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
b960: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
b970: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
b980: 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
b990: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
b9a0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
b9b0: 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
b9c0: 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
b9d0: 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
b9e0: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
b9f0: 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
ba00: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70   table..  */.  p
ba10: 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65   = (ExprHasPrope
ba20: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
ba30: 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53  lect) ? pX->x.pS
ba40: 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66  elect : 0);.  if
ba50: 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d  ( ALWAYS(pParse-
ba60: 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43  >nErr==0) && isC
ba70: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
ba80: 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (p) ){.    sqlit
ba90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
baa0: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
bab0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
bac0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
bad0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d  Expr *pExpr = p-
bae0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
baf0: 78 70 72 3b 20 20 20 2f 2a 20 45 78 70 72 65 73  xpr;   /* Expres
bb00: 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  sion <column> */
bb10: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
bb20: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
bb40: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c  ndex of column <
bb50: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 56  column> */.    V
bb60: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
bb70: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
bb80: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
bb90: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
bba0: 6f 64 65 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c  oded */.    Tabl
bbb0: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
bbc0: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 20 20 20  c->a[0].pTab;   
bbd0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62     /* Table <tab
bbe0: 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  le>. */.    int 
bbf0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
bc20: 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  dx for pTab */. 
bc30: 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61    .    /* Code a
bc40: 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  n OP_VerifyCooki
bc50: 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  e and OP_TableLo
bc60: 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
bc70: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
bc80: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
bc90: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
bca0: 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
bcb0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
bcc0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
bcd0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
bce0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
bcf0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
bd00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
bd10: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
bd20: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
bd30: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
bd40: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
bd50: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
bd60: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
bd70: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
bd80: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
bd90: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
bda0: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
bdb0: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
bdc0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
bdd0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
bde0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
bdf0: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
be00: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Mem;.      int i
be10: 41 64 64 72 3b 0a 0a 20 20 20 20 20 20 69 41 64  Addr;..      iAd
be20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
be30: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
be40: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
be50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
be60: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
be70: 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20  , iMem);..      
be80: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
be90: 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
bea0: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
beb0: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
bec0: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
bed0: 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c  OWID;..      sql
bee0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
bef0: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
bf00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
bf10: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
bf40: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  riable */..     
bf50: 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
bf60: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  n sequence used 
bf70: 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  by the compariso
bf80: 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69  n. If an index i
bf90: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
bfa0: 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
bfb0: 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20  f a temp-table, 
bfc0: 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72  it must be order
bfd0: 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20  ed according.   
bfe0: 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f     ** to this co
bff0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
c000: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  .  */.      Coll
c010: 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
c020: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
c030: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c040: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pX->pLeft, pExpr
c050: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  );..      /* Che
c060: 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
c070: 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
c080: 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
c090: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  m the .      ** 
c0a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68  comparison is th
c0b0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66  e same as the af
c0c0: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f  finity of the co
c0d0: 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a  lumn. If.      *
c0e0: 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  * it is not, it 
c0f0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
c100: 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  to use any index
c110: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c120: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
c130: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
c140: 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66  X);.      int af
c150: 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61  finity_ok = (pTa
c160: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  b->aCol[iCol].af
c170: 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66  finity==aff||aff
c180: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
c190: 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  E);..      for(p
c1a0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
c1b0: 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d  ; pIdx && eType=
c1c0: 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  =0 && affinity_o
c1d0: 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  k; pIdx=pIdx->pN
c1e0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
c1f0: 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ( (pIdx->aiColum
c200: 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20  n[0]==iCol).    
c210: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46       && sqlite3F
c220: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
c230: 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a  NC(db), pIdx->az
c240: 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65  Coll[0], 0)==pRe
c250: 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 21  q.         && (!
c260: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20  mustBeUnique || 
c270: 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  (pIdx->nColumn==
c280: 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72  1 && pIdx->onErr
c290: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20  or!=OE_None)).  
c2a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
c2b0: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
c2c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c2d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
c2e0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  r;.          cha
c2f0: 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20  r *pKey;.  .    
c300: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68        pKey = (ch
c310: 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65  ar *)sqlite3Inde
c320: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
c330: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
c340: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
c350: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c360: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
c370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c380: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c390: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
c3a0: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73  ;.  .          s
c3b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
c3c0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
c3d0: 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
c3e0: 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b         pKey,P4_K
c410: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
c420: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
c430: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
c440: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
c450: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
c460: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
c470: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ;..          sql
c480: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c490: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
c4a0: 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46        if( prNotF
c4b0: 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61  ound && !pTab->a
c4c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c  Col[iCol].notNul
c4d0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
c4e0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b   *prNotFound = +
c4f0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c510: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c520: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54   }.  }..  if( eT
c530: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ype==0 ){.    /*
c540: 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64   Could not found
c550: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
c560: 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
c570: 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
c580: 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
c590: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
c5a0: 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
c5b0: 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
c5c0: 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
c5d0: 20 20 20 64 6f 75 62 6c 65 20 73 61 76 65 64 4e     double savedN
c5e0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
c5f0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
c600: 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
c610: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
c620: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
c630: 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e 6f  PH;.    if( prNo
c640: 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20  tFound ){.      
c650: 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d  *prNotFound = rM
c660: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
c670: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 65   }else{.      te
c690: 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e  stcase( pParse->
c6a0: 6e 51 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75 62  nQueryLoop>(doub
c6b0: 6c 65 29 31 20 29 3b 0a 20 20 20 20 20 20 70 50  le)1 );.      pP
c6c0: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
c6d0: 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
c6e0: 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66      if( pX->pLef
c6f0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  t->iColumn<0 && 
c700: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
c710: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
c720: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
c730: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
c740: 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d  X_ROWID;.      }
c750: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c760: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
c770: 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
c780: 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
c790: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
c7a0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  ;.    pParse->nQ
c7b0: 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64  ueryLoop = saved
c7c0: 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65  NQueryLoop;.  }e
c7d0: 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
c7e0: 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
c7f0: 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
c800: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c810: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
c820: 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
c830: 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75  ies used as a su
c840: 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  bquery expressio
c850: 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72  n, EXISTS,.** or
c860: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
c870: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
c880: 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
c890: 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
c8a0: 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
c8b0: 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
c8c0: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
c8d0: 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
c8e0: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
c8f0: 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
c900: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
c910: 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
c920: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
c930: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
c940: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
c950: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
c960: 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
c970: 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
c980: 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
c990: 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
c9a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
c9b0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
c9c0: 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
c9d0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
c9e0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
c9f0: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
ca00: 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  o, then expressi
ca10: 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72  on pExpr is guar
ca20: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
ca30: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f  of the form "<ro
ca40: 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f  wid> IN (?, ?, ?
ca50: 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64  )", where <rowid
ca60: 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  > is a reference
ca70: 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65  .** to some inte
ca80: 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f  ger key column o
ca90: 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65  f a table B-Tree
caa0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
cab0: 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79  use an.** intkey
cac0: 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65   B-Tree to store
cad0: 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e   the set of IN(.
cae0: 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65  ..) values inste
caf0: 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
cb00: 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69  ** (slower) vari
cb10: 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73  able length keys
cb20: 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49   B-Tree..**.** I
cb30: 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
cb40: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74  s non-zero, that
cb50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
cb60: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
cb70: 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c  IN.** (not a SEL
cb80: 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61  ECT or EXISTS) a
cb90: 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20  nd that the RHS 
cba0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e  might contains N
cbb0: 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72  ULLs..** Further
cbc0: 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73 20  more, the IN is 
cbd0: 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  in a WHERE claus
cbe0: 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72 65  e and that we re
cbf0: 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20  ally want.** to 
cc00: 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68 65  iterate over the
cc10: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
cc20: 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65 72  perator in order
cc30: 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61   to quickly loca
cc40: 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73  te.** all corres
cc50: 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d  ponding LHS elem
cc60: 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73 20  ents.  All this 
cc70: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20  routine does is 
cc80: 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68  initialize.** th
cc90: 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e  e register given
cca0: 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   by rMayHaveNull
ccb0: 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69   to NULL.  Calli
ccc0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ng routines will
ccd0: 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66   take.** care of
cce0: 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72   changing this r
ccf0: 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74 6f  egister value to
cd00: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65   non-NULL if the
cd10: 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65   RHS is NULL-fre
cd20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
cd30: 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f  HaveNull is zero
cd40: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
cd50: 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  t the subquery i
cd60: 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20  s being used.** 
cd70: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74  for membership t
cd80: 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68  esting only.  Th
cd90: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
cda0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79  o initialize any
cdb0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f  .** registers to
cdc0: 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70 72   indicate the pr
cdd0: 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e 63  esense or absenc
cde0: 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68  e of NULLs on th
cdf0: 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  e RHS..**.** For
ce00: 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
ce10: 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65  STS operator, re
ce20: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
ce30: 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
ce40: 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  .** result.  For
ce50: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
ce60: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
ce70: 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  urs, the return 
ce80: 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23  value is 0..*/.#
ce90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cea0: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
ceb0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
cec0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
ced0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
cee0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
cef0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
cf00: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
cf10: 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
cf20: 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
cf30: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
cf40: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20  MayHaveNull,    
cf50: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
cf60: 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
cf70: 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
cf80: 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
cf90: 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
cfa0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
cfb0: 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
cfc0: 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
cfd0: 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64  .){.  int testAd
cfe0: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d000: 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61   One-time test a
d010: 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ddress */.  int 
d020: 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rReg = 0;       
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
d050: 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e  storing resultin
d060: 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  g */.  Vdbe *v =
d070: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d080: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e  pParse);.  if( N
d090: 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
d0a0: 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
d0b0: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
d0c0: 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  arse);..  /* Thi
d0d0: 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72  s code must be r
d0e0: 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65  un in its entire
d0f0: 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ty every time it
d100: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
d110: 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74    ** if any of t
d120: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
d130: 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
d140: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
d150: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
d160: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
d170: 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
d180: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
d190: 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
d1a0: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
d1b0: 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
d1c0: 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
d1d0: 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
d1e0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
d1f0: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
d200: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
d210: 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
d220: 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
d230: 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
d240: 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
d250: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
d260: 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
d270: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
d280: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
d290: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
d2a0: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
d2b0: 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
d2c0: 72 54 61 62 20 29 7b 0a 20 20 20 20 69 6e 74 20  rTab ){.    int 
d2d0: 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mem = ++pParse->
d2e0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
d2f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d300: 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20  P_If, mem);.    
d310: 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74  testAddr = sqlit
d320: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d330: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d  OP_Integer, 1, m
d340: 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  em);.    assert(
d350: 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 70   testAddr>0 || p
d360: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
d370: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a  cFailed );.  }..
d380: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d390: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66  MIT_EXPLAIN.  if
d3a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
d3b0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
d3c0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
d3d0: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
d3e0: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58   pParse->db, "EX
d3f0: 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55  ECUTE %s%s SUBQU
d400: 45 52 59 20 25 64 22 2c 20 74 65 73 74 41 64 64  ERY %d", testAdd
d410: 72 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  r?"":"CORRELATED
d420: 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
d430: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
d440: 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50  ST":"SCALAR", pP
d450: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
d460: 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
d470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d480: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
d490: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
d4a0: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
d4b0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
d4c0: 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
d4d0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
d4e0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
d4f0: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
d500: 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
d510: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
d520: 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
d530: 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79   IN */.      Key
d540: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 20 20 20  Info keyInfo;   
d550: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
d560: 6e 66 6f 20 66 6f 72 20 74 68 65 20 67 65 6e 65  nfo for the gene
d570: 72 61 74 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  rated table */. 
d580: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
d5b0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
d5c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
d5d0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
d5e0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
d5f0: 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
d600: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
d610: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  /..      if( rMa
d620: 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
d630: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d640: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d650: 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  l, 0, rMayHaveNu
d660: 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ll);.      }..  
d670: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
d680: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
d690: 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  ty(pLeft);..    
d6a0: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
d6b0: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
d6c0: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
d6d0: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
d6e0: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
d6f0: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
d700: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
d710: 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
d720: 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
d730: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
d740: 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64  single-field ind
d750: 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
d760: 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
d770: 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
d780: 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  he SELECT or the
d790: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
d7a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
d7b0: 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
d7c0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
d7d0: 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
d7e0: 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
d7f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
d800: 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
d810: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
d820: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
d830: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
d840: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
d850: 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
d860: 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
d870: 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
d880: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
d890: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
d8a0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
d8b0: 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
d8c0: 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
d8d0: 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
d8e0: 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
d8f0: 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
d900: 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
d910: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
d920: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
d930: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
d940: 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
d950: 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
d960: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
d970: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
d980: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d990: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d9a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d9b0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d9c0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
d9d0: 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20   !isRowid);.    
d9e0: 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
d9f0: 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ll==0 ) sqlite3V
da00: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
da10: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
da20: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
da30: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
da40: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
da50: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
da60: 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66  d = 1;..      if
da70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
da80: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
da90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
daa0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
dab0: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
dac0: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
dad0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
dae0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
daf0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
db00: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
db10: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
db20: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
db30: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
db40: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
db50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
db60: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
db70: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
db80: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
db90: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
dba0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
dbb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
dbc0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
dbd0: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
dbe0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
dbf0: 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 75  st.affinity = (u
dc00: 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
dc10: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
dc20: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
dc30: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
dc40: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
dc50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
dc60: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
dc70: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64 65  ->x.pSelect, &de
dc80: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
dc90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
dca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
dcb0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
dcc0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
dcd0: 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
dce0: 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26 20  YS(pEList!=0 && 
dcf0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29  pEList->nExpr>0)
dd00: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
dd10: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
dd20: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
dd30: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
dd40: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
dd50: 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft,.            
dd60: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
dd70: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
dd80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dd90: 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
dda0: 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  .pList!=0) ){.  
ddb0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
ddc0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
ddd0: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
dde0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
ddf0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
de00: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
de10: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
de20: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
de30: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
de40: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
de50: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
de60: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
de70: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
de80: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
de90: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
dea0: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
deb0: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
dec0: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
ded0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
dee0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
def0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
df00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
df10: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
df20: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
df30: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
df40: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
df50: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
df60: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
df70: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
df80: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
df90: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
dfa0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
dfb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dfc0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
dfd0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
dfe0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
dff0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
e000: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
e010: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
e020: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
e030: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
e040: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
e050: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
e060: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
e070: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
e080: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
e090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e0a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
e0b0: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
e0c0: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
e0d0: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
e0e0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
e0f0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
e100: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
e110: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
e120: 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
e130: 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
e140: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
e150: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
e160: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
e170: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
e180: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
e190: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
e1a0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
e1b0: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
e1c0: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
e1d0: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
e1e0: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
e1f0: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
e200: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
e210: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
e220: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
e230: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
e240: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
e250: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
e260: 66 28 20 74 65 73 74 41 64 64 72 20 26 26 20 21  f( testAddr && !
e270: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e280: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
e290: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e2a0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
e2b0: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
e2c0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   2);.           
e2d0: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
e2e0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
e2f0: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
e300: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
e310: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
e320: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
e330: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
e340: 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
e350: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
e360: 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
e370: 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
e380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e390: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
e3a0: 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
e3b0: 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
e3c0: 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
e3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e3e0: 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
e3f0: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
e400: 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
e410: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
e420: 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
e430: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e440: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e450: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e490: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e4b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e4c0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
e4d0: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
e4e0: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
e4f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e510: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
e520: 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
e530: 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
e540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e550: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
e560: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
e570: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e590: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e5a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
e5b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
e5c0: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
e5d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
e5e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e5f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
e600: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
e610: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
e620: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
e630: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
e640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e650: 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20   !isRowid ){.   
e660: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e670: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
e680: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
e690: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e6b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
e6c0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
e6d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
e6e0: 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
e6f0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
e700: 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
e710: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
e720: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e730: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
e740: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
e750: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
e760: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
e770: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
e780: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
e790: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
e7a0: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
e7b0: 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
e7c0: 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
e7d0: 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
e7e0: 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
e7f0: 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
e800: 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
e810: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
e820: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
e830: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
e840: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
e850: 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e870: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e880: 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
e890: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
e8a0: 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
e8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
e8c0: 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
e8d0: 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
e8e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e8f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
e900: 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
e910: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e920: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
e930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e940: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
e950: 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
e960: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
e970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
e980: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
e990: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
e9a0: 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
e9b0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
e9c0: 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
e9d0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
e9e0: 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
e9f0: 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
ea00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
ea10: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
ea20: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
ea30: 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
ea40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ea50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
ea60: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
ea70: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
ea80: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
ea90: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
eaa0: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
eab0: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
eac0: 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
ead0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
eae0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eaf0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
eb00: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
eb10: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
eb20: 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
eb30: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
eb40: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
eb50: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
eb60: 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
eb70: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
eb80: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
eb90: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
eba0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
ebb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54      &sqlite3IntT
ebe0: 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20  okens[1]);.     
ebf0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
ec00: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
ec10: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
ec20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
ec30: 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20     }.      rReg 
ec40: 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20  = dest.iParm;.  
ec50: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
ec60: 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20  ucible(pExpr);. 
ec70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ec80: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
ec90: 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c  tAddr ){.    sql
eca0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ecb0: 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b  (v, testAddr-1);
ecc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
ecd0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
ece0: 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e, 1);..  return
ecf0: 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
ed00: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
ed10: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
ed20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ed30: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
ed40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
ed50: 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
ed60: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
ed70: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
ed80: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
ed90: 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
eda0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
edb0: 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
edc0: 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  is a scalar expr
edd0: 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67  ession.  The rig
ede0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
edf0: 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61  S).** is an arra
ee00: 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
ee10: 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65  e values.  The e
ee20: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
ee30: 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a  e if the LHS is.
ee40: 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
ee50: 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68  hin the RHS.  Th
ee60: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65  e value of the e
ee70: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b  xpression is unk
ee80: 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69  nown (NULL).** i
ee90: 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
eea0: 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20  L or if the LHS 
eeb0: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
eec0: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
eed0: 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63  and the.** RHS c
eee0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
eef0: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
ef00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ef10: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
ef20: 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  de will jump to 
ef30: 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
ef40: 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
ef50: 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
ef60: 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
ef70: 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
ef80: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
ef90: 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
efa0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
efb0: 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
efc0: 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
efd0: 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
efe0: 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
eff0: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
f000: 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
f010: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
f020: 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
f030: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f040: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f050: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
f060: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
f070: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
f080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f090: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
f0a0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
f0b0: 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
f0c0: 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
f0d0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
f0e0: 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
f0f0: 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
f100: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
f110: 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
f120: 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
f130: 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
f140: 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
f150: 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
f160: 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
f170: 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
f180: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
f190: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
f1a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
f1b0: 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74  rison affinity t
f1c0: 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65  o use */.  int e
f1d0: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
f1e0: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
f1f0: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b  RHS */.  int r1;
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f210: 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
f220: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64  register */.  Vd
f230: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
f240: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
f250: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f260: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ion */..  /* Com
f270: 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20  pute the RHS.   
f280: 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
f290: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
f2a0: 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70  cursor.  ** pExp
f2b0: 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63  r->iTable will c
f2c0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
f2d0: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
f2e0: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
f2f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f300: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
f310: 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
f320: 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
f330: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
f340: 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
f350: 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
f360: 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
f370: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
f380: 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
f390: 2c 20 70 45 78 70 72 2c 20 26 72 52 68 73 48 61  , pExpr, &rRhsHa
f3a0: 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69  sNull);..  /* Fi
f3b0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
f3c0: 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
f3d0: 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
f3e0: 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
f3f0: 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
f400: 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
f410: 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
f420: 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
f430: 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66  e for.  ** P4 of
f440: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
f450: 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20    */.  affinity 
f460: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
f470: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
f480: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
f490: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
f4a0: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
f4b0: 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  )"..  */.  sqlit
f4c0: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
f4d0: 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20  pParse);.  r1 = 
f4e0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f4f0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
f500: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f510: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f520: 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  t, r1);..  /* If
f530: 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c   the LHS is NULL
f540: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
f550: 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c 73  t is either fals
f560: 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64  e or NULL depend
f570: 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74  ing.  ** on whet
f580: 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65  her the RHS is e
f590: 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73  mpty or not, res
f5a0: 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a  pectively..  */.
f5b0: 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
f5c0: 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
f5d0: 0a 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74  .    /* Shortcut
f5e0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
f5f0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66  case where the f
f600: 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75  alse and NULL ou
f610: 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a  tcomes are.    *
f620: 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  * the same. */. 
f630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f640: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
f650: 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c  l, r1, destIfNul
f660: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
f670: 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
f680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f690: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31  , OP_NotNull, r1
f6a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f6b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f6c0: 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
f6d0: 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
f6e0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
f6f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f700: 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
f710: 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
f720: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f730: 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20   addr1);.  }..  
f740: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
f750: 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
f760: 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
f770: 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
f780: 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
f790: 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20  b-tree.    */.  
f7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f7b0: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
f7c0: 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46  Int, r1, destIfF
f7d0: 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alse);.    sqlit
f7e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f7f0: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45  OP_NotExists, pE
f800: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
f810: 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20  tIfFalse, r1);. 
f820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
f830: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
f840: 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78   RHS is an index
f850: 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a   b-tree..    */.
f860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f870: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
f880: 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20  nity, r1, 1, 0, 
f890: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a  &affinity, 1);..
f8a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
f8b0: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
f8c0: 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  t fails, then th
f8d0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f8e0: 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e  .    ** "x IN (.
f8f0: 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
f900: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
f910: 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65   or NULL. If the
f920: 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74   set.    ** cont
f930: 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  ains no NULL val
f940: 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
f950: 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68  sult is 0. If th
f960: 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f  e set .    ** co
f970: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
f980: 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  re NULL values, 
f990: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
f9a0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78  of the.    ** ex
f9b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f  pression is also
f9c0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
f9d0: 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
f9e0: 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66 46 61  l==0 || destIfFa
f9f0: 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
fa00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
fa10: 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
fa20: 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
fa30: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74  ompile time that
fa40: 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20 2a   the RHS.      *
fa50: 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
fa60: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
fa70: 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68  is happens as th
fa80: 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
fa90: 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
faa0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
fab0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
fac0: 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ema..      **.  
fad0: 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20      ** Also run 
fae0: 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e  this branch if N
faf0: 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ULL is equivalen
fb00: 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20  t to FALSE.     
fb10: 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72   ** for this par
fb20: 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61  ticular IN opera
fb30: 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tor..      */.  
fb40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fb50: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
fb60: 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
fb70: 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
fb80: 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20  lse, r1, 1);..  
fb90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
fba0: 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68  * In this branch
fbb0: 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  , the RHS of the
fbc0: 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69   IN might contai
fbd0: 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20  n a NULL and.   
fbe0: 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e     ** the presen
fbf0: 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20  ce of a NULL on 
fc00: 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20  the RHS makes a 
fc10: 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
fc20: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f  e.      ** outco
fc30: 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  me..      */.   
fc40: 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a     int j1, j2, j
fc50: 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 72  3;..      /* Fir
fc60: 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
fc70: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  if the LHS is co
fc80: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
fc90: 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20  HS.  If so,.    
fca0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 72    ** then the pr
fcb0: 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20  esence of NULLs 
fcc0: 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 20  in the RHS does 
fcd0: 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a  not matter, so j
fce0: 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ump.      ** ove
fcf0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
fd00: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a  e that follows..
fd10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
fd20: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
fd30: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
fd40: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
fd50: 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a  ble, 0, r1, 1);.
fd60: 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65 20 77  .      /* Here w
fd70: 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61 74 69  e begin generati
fd80: 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  ng code that run
fd90: 73 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  s if the LHS is 
fda0: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  not.      ** con
fdb0: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
fdc0: 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61 74 65  e RHS.  Generate
fdd0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65   additional code
fde0: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
fdf0: 65 73 74 73 20 74 68 65 20 52 48 53 20 66 6f 72  ests the RHS for
fe00: 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68 65 20   NULLs.  If the 
fe10: 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  RHS contains a N
fe20: 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  ULL then.      *
fe30: 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  * jump to destIf
fe40: 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20  Null.  If there 
fe50: 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20  are no NULLs in 
fe60: 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20 20 20  the RHS then.   
fe70: 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
fe80: 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20 20 20  stIfFalse..     
fe90: 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d 20 73   */.      j2 = s
fea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
feb0: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
fec0: 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
fed0: 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33      j3 = sqlite3
fee0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
fef0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
ff00: 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 52 68  ->iTable, 0, rRh
ff10: 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20  sHasNull, 1);.  
ff20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
ff40: 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48 61 73  ger, -1, rRhsHas
ff50: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
ff60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ff70: 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 73  (v, j3);.      s
ff80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ff90: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72  (v, OP_AddImm, r
ffa0: 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a  RhsHasNull, 1);.
ffb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ffc0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
ffd0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
ffe0: 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
fff0: 61 74 65 20 74 61 72 67 65 74 20 64 65 70 65 6e  ate target depen
10000 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
10010 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  or not.      ** 
10020 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
10030 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2f   a NULL.      */
10040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10060 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  f, rRhsHasNull, 
10070 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
10080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10090 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
100a0 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
100b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
100c0 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68 65 20  OP_Found at the 
100d0 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72 61 6e  top of this bran
100e0 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20 77 68  ch jumps here wh
100f0 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20 20 20  en true, .      
10100 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65 20 6f  ** causing the o
10110 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72 65 73  verall IN expres
10120 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20  sion evaluation 
10130 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  to fall through.
10140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10150 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10160 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
10170 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
10180 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10190 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
101a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
101b0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 56  (pParse, 1);.  V
101c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
101d0 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
101e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
101f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10200 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69   */../*.** Dupli
10210 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76  cate an 8-byte v
10220 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  alue.*/.static c
10230 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56  har *dup8bytes(V
10240 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
10250 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  ar *in){.  char 
10260 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *out = sqlite3Db
10270 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65  MallocRaw(sqlite
10280 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a  3VdbeDb(v), 8);.
10290 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
102a0 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c   memcpy(out, in,
102b0 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   8);.  }.  retur
102c0 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65  n out;.}..#ifnde
102d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
102e0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
102f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
10300 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
10310 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
10320 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
10330 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
10340 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
10350 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
10360 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
10370 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
10380 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
10390 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
103a0 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
103b0 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
103c0 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
103d0 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
103e0 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
103f0 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
10400 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
10410 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10420 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
10430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
10440 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
10450 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
10460 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
10470 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
10480 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  e;.    char *zV;
10490 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
104a0 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
104b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
104c0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
104d0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
104e0 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
104f0 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
10500 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
10510 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
10520 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
10530 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
10540 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
10550 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
10560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10570 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65  eAddOp4(v, OP_Re
10580 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
10590 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  zV, P4_REAL);.  
105a0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
105b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
105c0 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
105d0 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
105e0 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
105f0 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
10600 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
10610 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
10620 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
10630 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
10640 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
10650 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
10660 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
10670 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10680 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
10690 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
106a0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
106b0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
106c0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
106d0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
106e0 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
106f0 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 69 66  u.iValue;.    if
10700 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
10710 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
10720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10730 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
10740 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10750 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
10760 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
10770 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
10780 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
10790 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
107a0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 41 74     c = sqlite3At
107b0 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 2c 20  oi64(z, &value, 
107c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
107d0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
107e0 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c  ;.    if( c==0 |
107f0 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c  | (c==2 && negFl
10800 61 67 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ag) ){.      cha
10810 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66 28  r *zV;.      if(
10820 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
10830 65 20 3d 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  e = -value; }.  
10840 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
10850 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
10860 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
10870 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10880 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
10890 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
108a0 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
108b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
108c0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
108d0 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
108e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
108f0 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
10900 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
10910 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
10920 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
10930 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
10940 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23  egFlag, iMem);.#
10950 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
10960 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
10970 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
10980 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
10990 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
109a0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
109b0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
109c0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
109d0 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
109e0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
109f0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
10a00 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
10a10 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
10a20 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
10a30 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
10a40 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
10a50 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
10a60 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
10a70 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
10a80 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
10a90 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
10aa0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
10ab0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
10ac0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
10ad0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
10ae0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
10af0 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
10b00 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10b10 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
10b20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
10b30 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
10b40 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
10b50 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
10b60 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  he *p;..  assert
10b70 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20  ( iReg>0 );  /* 
10b80 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  Register numbers
10b90 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
10ba0 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
10bb0 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
10bc0 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
10bd0 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
10be0 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
10bf0 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
10c00 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
10c10 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
10c20 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
10c30 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
10c40 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
10c50 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
10c60 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
10c70 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
10c80 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
10c90 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
10ca0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
10cb0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
10cc0 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6c 75  gs & SQLITE_Colu
10cd0 6d 6e 43 61 63 68 65 20 29 20 72 65 74 75 72 6e  mnCache ) return
10ce0 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
10cf0 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
10d00 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
10d10 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
10d20 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
10d30 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
10d40 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
10d50 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
10d60 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
10d70 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
10d80 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
10d90 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
10da0 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
10db0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
10dc0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
10dd0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
10de0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
10df0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 23 69 66  ; i++, p++){.#if
10e00 20 30 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20   0 /* This code 
10e10 77 6f 6c 64 20 72 65 6d 6f 76 65 20 74 68 65 20  wold remove the 
10e20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63  entry from the c
10e30 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
10e40 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  ed */.    if( p-
10e50 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 54 61 62  >iReg && p->iTab
10e60 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 2d 3e 69  le==iTab && p->i
10e70 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20 29 7b 0a  Column==iCol ){.
10e80 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
10e90 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
10ea0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  ;.      p->iLeve
10eb0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
10ec0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
10ed0 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
10ee0 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
10ef0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
10f00 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
10f10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
10f20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
10f30 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
10f40 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
10f50 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
10f60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
10f70 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
10f80 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
10f90 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
10fa0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
10fb0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
10fc0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
10fd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
10fe0 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
10ff0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
11000 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11010 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
11020 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
11030 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
11040 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
11050 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
11060 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
11070 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
11080 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
11090 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
110a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
110b0 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
110c0 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
110d0 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
110e0 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
110f0 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
11100 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
11110 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
11120 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
11130 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
11140 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
11150 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
11160 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
11170 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
11180 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
11190 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
111a0 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
111b0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
111c0 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
111d0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
111e0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
111f0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
11200 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
11210 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
11220 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
11230 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
11240 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
11250 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
11260 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11270 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
11280 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
11290 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
112a0 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
112b0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
112c0 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
112d0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
112e0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
112f0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
11300 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11310 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
11320 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
11330 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
11340 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  t i;.  int iLast
11350 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d   = iReg + nReg -
11360 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   1;.  struct yCo
11370 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
11380 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11390 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
113a0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
113b0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
113c0 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
113d0 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20      if( r>=iReg 
113e0 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  && r<=iLast ){. 
113f0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
11400 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
11410 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
11420 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11430 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
11440 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
11450 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
11460 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
11470 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
11480 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
11490 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
114a0 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
114b0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
114c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
114d0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
114e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
114f0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
11500 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
11510 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a  CacheLevel++;.}.
11520 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
11530 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
11540 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
11550 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
11560 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
11570 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68   previous N Push
11580 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e   operations.  In
11590 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
115a0 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a  store the cache.
115b0 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ** to the state 
115c0 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68  it was in N Push
115d0 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  es ago..*/.void 
115e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
115f0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
11600 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  e, int N){.  int
11610 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
11620 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
11630 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73  ert( N>0 );.  as
11640 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
11650 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a  acheLevel>=N );.
11660 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
11670 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f  Level -= N;.  fo
11680 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11690 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
116a0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
116b0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
116c0 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
116d0 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ->iLevel>pParse-
116e0 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
116f0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
11700 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
11710 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
11720 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
11730 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
11740 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
11750 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
11760 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
11770 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
11780 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
11790 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
117a0 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
117b0 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
117c0 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
117d0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
117e0 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
117f0 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
11800 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
11810 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11820 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11830 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
11840 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11850 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
11860 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
11870 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
11880 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11890 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
118a0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
118b0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
118c0 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
118d0 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
118e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
118f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11900 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
11910 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
11920 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
11930 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
11940 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11950 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
11960 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
11970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
11980 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
11990 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
119a0 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
119b0 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
119c0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
119d0 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
119e0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
119f0 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
11a00 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
11a10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
11a20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
11a30 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
11a40 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
11a50 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 64  xtract the valud
11a60 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
11a70 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
11a80 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
11a90 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
11aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ab0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
11ac0 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
11ad0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
11ae0 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
11af0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
11b00 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
11b10 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
11b20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
11b30 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20   iTabCur, iCol, 
11b40 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
11b50 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
11b60 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
11b70 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
11b80 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
11b90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
11ba0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
11bb0 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
11bc0 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
11bd0 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
11be0 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
11bf0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
11c00 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  in a register.  
11c10 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20  An effort.** is 
11c20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
11c30 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
11c40 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c  n register iReg,
11c50 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20   but this is.** 
11c60 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20  not guaranteed. 
11c70 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
11c80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
11c90 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
11ca0 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
11cb0 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
11cc0 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
11cd0 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
11ce0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
11cf0 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
11d00 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
11d10 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
11d20 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
11d30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11d40 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
11d50 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
11d60 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
11d70 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
11d80 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
11d90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11da0 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
11db0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
11dc0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
11dd0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
11de0 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
11df0 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
11e00 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
11e10 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
11e20 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
11e30 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
11e40 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
11e50 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
11e60 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
11e70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
11e80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
11e90 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
11ea0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
11eb0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11ec0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11ed0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11ee0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
11ef0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20    if( p->iReg>0 
11f00 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  && p->iTable==iT
11f10 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  able && p->iColu
11f20 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn==iColumn ){. 
11f30 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
11f40 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
11f50 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
11f60 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
11f70 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e  ster(pParse, p->
11f80 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74  iReg);.      ret
11f90 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  urn p->iReg;.   
11fa0 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72   }.  }  .  asser
11fb0 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
11fc0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
11fd0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
11fe0 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
11ff0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
12000 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12010 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
12020 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
12030 52 65 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  Reg);.  return i
12040 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
12050 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
12060 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
12070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
12080 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
12090 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
120a0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
120b0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
120c0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
120d0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
120e0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
120f0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12100 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a   if( p->iReg ){.
12110 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
12120 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
12130 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
12140 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
12150 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
12160 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
12170 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
12180 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
12190 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
121a0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
121b0 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
121c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
121d0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
121e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
121f0 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
12200 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74  iCount){.  sqlit
12210 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
12220 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74  e(pParse, iStart
12230 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a  , iCount);.}../*
12240 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12250 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
12260 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
12270 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
12280 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
12290 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
122a0 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d  . Keep the colum
122b0 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61  n cache up-to-da
122c0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
122d0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
122e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
122f0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
12300 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
12310 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
12320 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
12330 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d  if( NEVER(iFrom=
12340 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a  =iTo) ) return;.
12350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12360 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
12370 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
12380 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
12390 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
123a0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
123b0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
123c0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
123d0 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52     int x = p->iR
123e0 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69  eg;.    if( x>=i
123f0 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b  From && x<iFrom+
12400 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d  nReg ){.      p-
12410 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72  >iReg += iTo-iFr
12420 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  om;.    }.  }.}.
12430 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12440 63 6f 64 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e  code to copy con
12450 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
12460 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
12470 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
12480 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
12490 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g-1..*/.void sql
124a0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
124b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
124c0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
124d0 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
124e0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 4e 45   int i;.  if( NE
124f0 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20  VER(iFrom==iTo) 
12500 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
12510 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b  i=0; i<nReg; i++
12520 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12530 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
12540 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
12550 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29   iFrom+i, iTo+i)
12560 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
12570 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
12580 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
12590 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
125a0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
125b0 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
125c0 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
125d0 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
125e0 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
125f0 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12600 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
12610 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12620 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
12630 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
12640 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
12650 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
12660 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
12670 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
12680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12690 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
126a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
126b0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
126c0 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
126d0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
126e0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
126f0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12700 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12710 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12720 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
12730 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
12740 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
12750 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
12760 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
12770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
12780 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12790 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
127a0 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
127b0 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  T */../*.** Gene
127c0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
127d0 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
127e0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
127f0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
12800 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
12810 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
12820 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
12830 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
12840 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
12850 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
12860 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
12870 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
12880 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
12890 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
128a0 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
128b0 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
128c0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
128d0 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
128e0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
128f0 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
12900 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
12910 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
12920 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
12930 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
12940 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
12950 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
12960 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
12970 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
12980 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
12990 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
129a0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
129b0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
129c0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
129d0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
129e0 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
129f0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
12a00 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
12a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12a20 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
12a30 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
12a40 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
12a50 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
12a60 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
12a70 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
12a80 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
12a90 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
12aa0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
12ab0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
12ac0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
12ad0 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
12ae0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
12af0 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
12b00 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
12b10 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
12b20 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
12b30 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
12b40 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
12b50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12b60 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
12b70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12b80 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
12b90 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
12ba0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
12bb0 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
12bc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
12bd0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
12be0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
12bf0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
12c00 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
12c10 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
12c20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
12c30 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
12c40 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
12c50 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
12c60 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
12c70 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
12c80 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
12c90 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
12ca0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
12cb0 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
12cc0 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
12cd0 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
12ce0 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
12cf0 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
12d00 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
12d10 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
12d20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
12d30 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
12d40 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
12d50 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
12d60 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
12d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12d80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
12d90 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
12da0 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  >sortingIdx,.   
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
12dd0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
12de0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
12df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12e00 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
12e10 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
12e20 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
12e30 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
12e40 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
12e50 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
12e60 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
12e70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
12e80 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
12e90 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
12ea0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
12eb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12ec0 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
12ed0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
12ee0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
12ef0 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
12f00 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ase;.      }else
12f10 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
12f20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12f30 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
12f40 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a  e, pExpr->pTab,.
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f70 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
12f80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12f90 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
12fa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12fb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12fc0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
12fd0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
12fe0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
12ff0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
13000 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
13010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
13020 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
13030 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
13040 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
13050 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
13060 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
13070 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
13080 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
13090 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
130a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
130b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
130c0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
130d0 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
130e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
130f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
13100 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
13110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13120 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
13130 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20  ng8, 0, target, 
13140 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
13150 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  en, 0);.      br
13160 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13170 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
13180 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13190 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
131a0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
131b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
131c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
131d0 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
131e0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
131f0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
13200 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
13210 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
13220 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
13230 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13240 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13250 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13270 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
13280 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
13290 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
132a0 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
132b0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
132c0 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
132d0 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
132e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
132f0 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
13300 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
13310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
13320 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
13330 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
13340 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
13350 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
13360 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
13370 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13380 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
13390 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
133a0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
133b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
133c0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
133d0 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
133e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
133f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
13400 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
13410 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
13420 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
13430 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
13440 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
13450 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
13460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13470 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
13480 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
13490 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
134a0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
134b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
134c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
134d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
134e0 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 75 2e  v, -1, pExpr->u.
134f0 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
13500 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13510 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13520 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
13530 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
13540 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
13550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13560 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
13570 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
13580 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
13590 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
135a0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
135b0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
135c0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
135d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
135e0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
135f0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
13600 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
13610 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
13620 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
13630 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74        int aff, t
13640 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65  o_op;.      inRe
13650 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
13660 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
13670 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
13680 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61  target);.      a
13690 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
136a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
136b0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
136c0 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
136d0 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
136e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
136f0 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61  .      to_op = a
13700 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff - SQLITE_AFF_
13710 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74  TEXT + OP_ToText
13720 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13730 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
13740 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13750 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29  TE_AFF_TEXT    )
13760 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13770 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
13780 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13790 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29  TE_AFF_NONE    )
137a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
137b0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
137c0 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49  ric || aff!=SQLI
137d0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
137e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
137f0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
13800 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13810 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
13820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13830 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
13840 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
13850 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29  TE_AFF_REAL    )
13860 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13870 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
13880 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  xt );.      test
13890 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
138a0 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  ToBlob );.      
138b0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
138c0 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b  =OP_ToNumeric );
138d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
138e0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
138f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13900 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
13910 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Real );.      if
13920 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
13930 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13940 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13950 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
13960 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13970 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
13980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
139a0 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65  1(v, to_op, inRe
139b0 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  g);.      testca
139c0 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
139d0 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
139e0 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
139f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13a00 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
13a10 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
13a20 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  g, 1);.      bre
13a30 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
13a40 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
13a50 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
13a60 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
13a70 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
13a80 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
13a90 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
13aa0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
13ab0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
13ac0 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
13ad0 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
13ae0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
13af0 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
13b00 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
13b10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13b20 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
13b30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b40 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
13b50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13b60 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
13b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13b80 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
13b90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13ba0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
13bb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
13bc0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13bd0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
13be0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13bf0 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
13c00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13c10 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
13c20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
13c30 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13c40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13c50 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
13c60 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
13c70 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
13c80 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
13c90 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
13ca0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
13cb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13cc0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
13cd0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
13cf0 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
13d00 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
13d10 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
13d20 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
13d30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
13d40 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
13d50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13d60 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
13d70 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
13d80 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
13d90 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
13da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13db0 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
13dc0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
13dd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
13de0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
13df0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
13e00 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
13e10 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
13e20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
13e30 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
13e40 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
13e50 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
13e60 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
13e70 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
13e80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
13e90 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
13ea0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
13eb0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
13ec0 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
13ed0 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55  REP2 | SQLITE_NU
13ee0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
13ef0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
13f00 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
13f10 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
13f20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
13f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13f40 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
13f50 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
13f60 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
13f70 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
13f80 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
13f90 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
13fa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
13fb0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
13fc0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
13fd0 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
13fe0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
13ff0 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
14000 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
14010 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
14020 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
14030 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
14040 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
14050 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
14060 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
14070 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
14080 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
14090 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
140a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
140b0 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
140c0 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
140d0 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
140e0 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
140f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
14100 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
14110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14120 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
14130 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
14140 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
14150 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
14160 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
14170 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
14180 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
14190 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
141a0 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
141b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
141c0 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
141d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
141e0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
141f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14200 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  PLUS );.      te
14210 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
14220 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  INUS );.      te
14230 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
14240 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EM );.      test
14250 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
14260 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
14270 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
14280 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  TOR );.      tes
14290 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
142a0 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ASH );.      tes
142b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
142c0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65  HIFT );.      te
142d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
142e0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74  SHIFT );.      t
142f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14300 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
14310 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14320 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14330 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14340 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14350 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
14360 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14370 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14380 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
143a0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
143b0 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
143c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
143d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
143e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
143f0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14400 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14410 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
14420 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
14430 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
14440 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
14450 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
14460 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
14470 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
14480 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
14490 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
144a0 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  t, 1, target);.#
144b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
144c0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
144d0 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
144e0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
144f0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
14500 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
14510 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14520 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
14530 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
14540 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
14550 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
14560 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
14570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
14580 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71  gFree1 = r1 = sq
14590 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
145a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
145b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
145c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
145d0 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , 0, r1);.      
145e0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
145f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14600 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14610 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14630 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
14640 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
14650 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
14660 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14670 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
14680 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
14690 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
146a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
146b0 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
146c0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
146d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
146e0 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
146f0 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Not );.      ass
14700 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
14710 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Not );.      tes
14720 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
14730 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  TNOT );.      te
14740 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
14750 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
14760 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14770 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14780 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
14790 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
147a0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
147b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  =0 );.      inRe
147c0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
147d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
147e0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
147f0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
14800 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14810 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
14820 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
14830 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
14840 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
14850 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
14860 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
14870 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
14880 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
14890 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
148a0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
148b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
148c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
148d0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
148e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
148f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14900 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
14910 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
14920 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14930 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
14940 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
14950 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14960 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
14970 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14980 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
14990 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
149a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
149b0 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
149c0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , -1);.      sql
149d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
149e0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
149f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14a00 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
14a10 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
14a20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
14a30 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
14a40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
14a50 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
14a60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14a70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14a80 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14aa0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14ab0 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
14ac0 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
14ad0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
14ae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14af0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
14b00 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
14b10 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
14b20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
14b30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14b40 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
14b50 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
14b60 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
14b70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
14b80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
14b90 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
14ba0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
14bb0 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
14bc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
14bd0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
14be0 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
14bf0 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
14c00 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
14c10 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
14c20 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ect */.      int
14c30 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20   nId;           
14c40 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
14c50 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
14c60 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  me in bytes */. 
14c70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14c80 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
14c90 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
14ca0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6f   */.      int co
14cb0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
14cc0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
14cd0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
14ce0 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
14cf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14d20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
14d30 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
14d40 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
14d50 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
14d60 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
14d70 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
14d80 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
14d90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14da0 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  nce */..      as
14db0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
14dc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14dd0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
14de0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14df0 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  p==TK_CONST_FUNC
14e00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14e10 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  se( op==TK_FUNCT
14e20 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ION );.      if(
14e30 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
14e40 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
14e50 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
14e60 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20      pFarg = 0;. 
14e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14e80 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70      pFarg = pExp
14e90 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
14ea0 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20    }.      nFarg 
14eb0 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d  = pFarg ? pFarg-
14ec0 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
14ed0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
14ee0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
14ef0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
14f00 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ;.      zId = pE
14f10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
14f20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74       nId = sqlit
14f30 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b  e3Strlen30(zId);
14f40 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
14f50 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
14f60 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  n(db, zId, nId, 
14f70 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
14f80 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
14f90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
14fa0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14fb0 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
14fc0 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c  nction: %.*s()",
14fd0 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
14fe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14ff0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
15000 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
15010 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
15020 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
15030 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
15040 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
15050 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
15060 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
15070 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20  y evalation of. 
15080 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
15090 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
150a0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
150b0 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
150c0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61     if( pDef->fla
150d0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
150e0 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20  _COALESCE ){.   
150f0 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c       int endCoal
15100 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  esce = sqlite3Vd
15110 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15130 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20  nFarg>=2 );.    
15140 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15150 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
15160 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
15170 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
15180 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67  for(i=1; i<nFarg
15190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
151a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
151b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
151c0 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f  l, target, endCo
151d0 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
151e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
151f0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
15200 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20  , target, 1);.  
15210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15220 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
15230 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
15240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
15250 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
15260 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
15270 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
15280 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
15290 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
152a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
152b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
152c0 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
152d0 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
152e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
152f0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  ..      if( pFar
15300 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20  g ){.        r1 
15310 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15320 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
15330 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  arg);.        sq
15340 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
15350 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  sh(pParse);     
15360 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
15370 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
15380 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15390 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
153a0 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 31 29 3b  , pFarg, r1, 1);
153b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
153c0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
153d0 72 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69  rse, 1);   /* Ti
153e0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
153f0 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
15400 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
15410 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
15420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
15430 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
15440 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
15450 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
15460 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
15470 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
15480 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
15490 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
154a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
154b0 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
154c0 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
154d0 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
154e0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
154f0 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
15500 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
15510 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
15520 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
15530 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
15540 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
15550 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
15560 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
15570 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
15580 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
15590 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
155a0 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
155b0 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
155c0 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
155d0 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
155e0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
155f0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
15600 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
15610 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
15620 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
15630 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
15640 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
15650 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
15660 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
15670 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
15680 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
15690 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
156a0 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
156b0 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
156c0 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
156d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
156e0 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
156f0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
15700 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
15710 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
15720 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
15730 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
15740 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
15750 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
15760 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
15770 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
15780 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
15790 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
157a0 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
157b0 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
157c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
157d0 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
157e0 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
157f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
15800 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
15810 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
15820 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
15830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
15840 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69  nstMask |= (1<<i
15850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15860 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
15870 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
15880 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
15890 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
158a0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
158b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
158c0 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
158d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
158e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
158f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
15900 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15910 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
15920 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
15930 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
15940 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
15950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15960 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
15970 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
15980 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
15990 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
159a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
159b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
159c0 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
159d0 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
159e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
159f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
15a00 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
15a10 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
15a20 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
15a30 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
15a40 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 29 7b      if( nFarg ){
15a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15a60 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
15a70 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
15a80 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
15a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15aa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15ab0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
15ac0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
15ad0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
15ae0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ECT: {.      tes
15af0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
15b00 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
15b10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
15b20 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
15b30 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f  nReg = sqlite3Co
15b40 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
15b50 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
15b60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15b70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15b80 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
15b90 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
15ba0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15bb0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
15bc0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
15bd0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15be0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
15bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15c00 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
15c10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
15c20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
15c30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
15c40 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
15c50 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
15c60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15c70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15c80 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
15c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15ca0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
15cb0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
15cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15cd0 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
15ce0 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
15cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15d00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
15d10 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
15d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
15d30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15d40 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
15d50 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
15d60 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
15d70 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
15d80 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
15d90 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
15da0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
15db0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
15dc0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
15dd0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
15de0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
15df0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
15e00 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
15e10 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
15e20 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
15e30 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
15e40 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
15e50 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
15e60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
15e70 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
15e80 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
15e90 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
15ea0 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78  LItem = pExpr->x
15eb0 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  .pList->a;.     
15ec0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
15ed0 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a  pLItem->pExpr;..
15ee0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15ef0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15f00 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
15f10 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
15f20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
15f30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15f40 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
15f50 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
15f60 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
15f70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15f80 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
15f90 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71  );.      r3 = sq
15fa0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15fb0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
15fc0 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  4 = sqlite3GetTe
15fd0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15fe0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15ff0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
16000 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20  pRight, OP_Ge,. 
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c   r1, r2, r3, SQL
16030 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
16040 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20      pLItem++;.  
16050 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49      pRight = pLI
16060 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
16070 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16080 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16090 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
160a0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
160b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
160c0 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
160d0 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
160e0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
160f0 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  0 );.      codeC
16100 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
16110 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
16120 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c  _Le, r1, r2, r4,
16130 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
16140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16150 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16160 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72  And, r3, r4, tar
16170 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
16180 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16190 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
161a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
161b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
161c0 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72  e, r4);.      br
161d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
161e0 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
161f0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
16200 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
16210 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
16220 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
16230 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16240 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
16250 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
16260 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
16270 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
16280 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
16290 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
162a0 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
162b0 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
162c0 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
162d0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
162e0 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
162f0 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
16300 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
16310 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
16320 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
16330 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
16340 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
16350 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
16360 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
16370 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
16380 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
16390 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
163a0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
163b0 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
163c0 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
163d0 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
163e0 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
163f0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
16400 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
16410 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
16420 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
16430 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
16440 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
16450 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
16460 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
16470 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
16480 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
16490 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
164a0 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
164b0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
164c0 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
164d0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
164e0 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
164f0 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
16500 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
16510 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
16520 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
16530 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
16540 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
16550 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
16560 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
16570 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
16580 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
16590 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
165a0 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
165b0 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
165c0 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
165d0 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
165e0 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
165f0 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
16600 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
16610 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
16620 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
16630 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
16640 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
16650 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
16660 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
16670 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
16680 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
16690 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
166a0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
166b0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
166c0 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
166d0 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
166e0 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
166f0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
16700 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
16710 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
16720 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
16730 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
16740 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
16750 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
16760 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
16770 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
16780 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
16790 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
167a0 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
167b0 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
167c0 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
167d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
167e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
167f0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
16800 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
16810 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16820 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
16830 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
16840 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
16850 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16860 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
16870 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
16880 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
16890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
168a0 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
168b0 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
168c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
168d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
168e0 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
168f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
16900 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
16910 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
16920 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
16930 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
16940 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
16950 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
16960 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
16970 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
16980 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
16990 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
169a0 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
169b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
169c0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
169d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
169e0 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
169f0 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
16a00 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
16a10 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
16a20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
16a30 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
16a40 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
16a50 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20  is really real. 
16a60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
16a70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
16a80 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
16a90 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
16aa0 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
16ab0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
16ac0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ae0 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
16af0 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
16b00 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16b10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16b20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
16b30 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
16b40 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
16b50 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
16b60 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
16b70 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
16b80 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
16b90 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
16ba0 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
16bb0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
16bc0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
16bd0 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
16be0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
16bf0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
16c00 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
16c10 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
16c20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
16c30 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
16c40 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
16c50 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
16c60 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
16c70 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
16c80 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
16c90 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
16ca0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
16cb0 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
16cc0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
16cd0 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
16ce0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20   pExpr->pRight. 
16cf0 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
16d00 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
16d10 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20  re is no.    ** 
16d20 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20  ELSE clause and 
16d30 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61  no other term ma
16d40 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20  tches, then the 
16d50 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
16d60 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69    ** exprssion i
16d70 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
16d80 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
16d90 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
16da0 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
16db0 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
16dc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
16dd0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
16de0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
16df0 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
16e00 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
16e10 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
16e20 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
16e30 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
16e40 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
16e50 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
16e60 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
16e70 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
16e80 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
16e90 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
16ea0 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
16ed0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
16ee0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
16ef0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f10 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
16f20 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
16f30 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
16f40 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
16f70 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
16f80 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fa0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
16fb0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
16fc0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
16fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16fe0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
16ff0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
17000 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17010 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
17020 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
17030 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
17040 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
17050 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
17060 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
17070 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
17080 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
17090 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
170a0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
170b0 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
170c0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
170d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
170e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
170f0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
17100 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
17110 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
17120 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
17130 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
17140 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
17150 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
17160 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
17170 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
17180 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
17190 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
171a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
171b0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
171c0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
171d0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
171e0 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t((pExpr->x.pLis
171f0 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d  t->nExpr % 2) ==
17200 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
17210 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
17220 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
17230 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
17240 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
17250 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
17260 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
17270 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
17280 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
17290 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
172a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
172b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
172c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
172d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
172e0 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
172f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
17300 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
17310 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17320 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52  se( pX->op==TK_R
17330 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
17340 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65     cacheX.iTable
17350 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17360 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17370 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
17380 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17390 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
173a0 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f          cacheX.o
173b0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
173c0 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
173d0 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
173e0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
173f0 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58  .pLeft = &cacheX
17400 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
17410 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
17420 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
17430 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
17440 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
17450 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
17460 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
17470 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
17480 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
17490 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
174a0 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
174b0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
174c0 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
174d0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
174e0 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
174f0 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
17500 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
17510 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
17520 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
17530 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
17540 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17550 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
17560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17570 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
17580 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
17590 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
175a0 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
175b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
175c0 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
175d0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
175e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
175f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
17600 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
17610 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
17620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
17630 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
17640 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17650 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17660 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
17670 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
17680 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
17690 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
176a0 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
176b0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
176c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
176d0 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
176e0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
176f0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
17700 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
17710 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
17720 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
17730 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
17740 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17750 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
17760 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
17770 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
17780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17790 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
177a0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
177b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
177c0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
177d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
177e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
177f0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
17800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17810 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
17820 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17830 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17840 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17860 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17870 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
17880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17890 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
178a0 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  rse, 1);.      }
178b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
178c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
178d0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
178e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
178f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17900 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
17910 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
17920 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
17930 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
17940 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
17950 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17960 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17970 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
17980 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17990 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
179a0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
179b0 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
179c0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
179d0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
179e0 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
179f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
17a00 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
17a10 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
17a20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
17a30 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
17a40 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
17a50 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
17a60 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
17a70 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
17a80 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
17a90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17aa0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17ab0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
17ac0 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
17ad0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
17ae0 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
17af0 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
17b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
17b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17b20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
17b30 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
17b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17b50 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
17b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17b70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
17b80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17b90 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
17ba0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17bb0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
17bc0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
17bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17be0 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
17bf0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
17c00 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
17c10 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
17c20 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  ken,0);.      }e
17c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
17c40 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
17c50 6e 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  nt(pParse, pExpr
17c60 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70  ->affinity, pExp
17c70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
17c80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
17ca0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
17cb0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17cc0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
17cd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
17ce0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17cf0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
17d00 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
17d10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
17d20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
17d30 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
17d40 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
17d50 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
17d60 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
17d70 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
17d80 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
17d90 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
17da0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
17db0 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
17dc0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
17dd0 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
17de0 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
17df0 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
17e00 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
17e10 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
17e20 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
17e30 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
17e40 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
17e50 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  to zero..*/.int 
17e60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17e70 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
17e80 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
17e90 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
17ea0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
17eb0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17ec0 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c  ;.  int r2 = sql
17ed0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
17ee0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
17ef0 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d  , r1);.  if( r2=
17f00 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  =r1 ){.    *pReg
17f10 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = r1;.  }else{.
17f20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17f30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17f40 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67  , r1);.    *pReg
17f50 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
17f60 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
17f70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
17f80 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
17f90 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
17fa0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
17fb0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
17fc0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
17fd0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
17fe0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
17ff0 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
18000 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69  ter target..*/.i
18010 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
18020 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
18030 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
18040 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
18050 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
18060 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
18070 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
18080 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
18090 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
180a0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
180b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
180c0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
180d0 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
180e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
180f0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
18100 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
18110 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18120 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
18130 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
18140 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
18150 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
18160 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18170 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
18180 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
18190 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
181a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
181b0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
181c0 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
181d0 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
181e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
181f0 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   target;.}../*.*
18200 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18210 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
18220 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
18230 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
18240 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
18250 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
18260 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
18270 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
18280 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
18290 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
182a0 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
182b0 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
182c0 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
182d0 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
182e0 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
182f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
18300 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
18310 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
18320 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18330 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
18340 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
18350 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
18360 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
18370 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
18380 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
18390 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
183a0 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
183b0 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eused..*/.int sq
183c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
183d0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
183e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
183f0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
18400 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
18410 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
18420 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d  inReg;.  inReg =
18430 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18440 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18450 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
18460 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
18470 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
18480 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
18490 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f  erms to INSERT o
184a0 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74  r UPDATE.  And t
184b0 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  he only.  ** oth
184c0 65 72 20 70 6c 61 63 65 20 77 68 65 72 65 20 65  er place where e
184d0 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
184e0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
184f0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a   TK_REGISTER is.
18500 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c    ** in WHERE cl
18510 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
18520 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c    So as currentl
18530 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74  y implemented, t
18540 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20  here is.  ** no 
18550 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47  way for a TK_REG
18560 49 53 54 45 52 20 74 6f 20 65 78 69 73 74 20 68  ISTER to exist h
18570 65 72 65 2e 20 20 42 75 74 20 69 74 20 73 65 65  ere.  But it see
18580 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20  ms prudent to.  
18590 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41  ** keep the ALWA
185a0 59 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65  YS() in case the
185b0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
185c0 65 20 63 68 61 6e 67 65 20 77 69 74 68 20 66 75  e change with fu
185d0 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ture.  ** modifi
185e0 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e  cations or enhan
185f0 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66  cements. */.  if
18600 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
18610 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29  op!=TK_REGISTER)
18620 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d   ){  .    int iM
18630 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b  em;.    iMem = +
18640 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18660 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
18670 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20   inReg, iMem);. 
18680 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
18690 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78   = iMem;.    pEx
186a0 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d  pr->op2 = pExpr-
186b0 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  >op;.    pExpr->
186c0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
186d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
186e0 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nReg;.}../*.** R
186f0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45  eturn TRUE if pE
18700 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61  xpr is an consta
18710 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
18720 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
18730 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69  e.** for factori
18740 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
18750 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
18760 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a  xpressions are:.
18770 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
18780 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
18790 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f  evaluates to two
187a0 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73   or more opcodes
187b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  ..**.**    *  An
187c0 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50  y OP_Integer, OP
187d0 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67  _Real, OP_String
187e0 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75  , OP_Blob, OP_Nu
187f0 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72  ll, .**       or
18800 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61   OP_Variable tha
18810 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
18820 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
18830 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63  a .**       spec
18840 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a  ific register..*
18850 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  *.** There is no
18860 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72   point in factor
18870 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69  ing out single-i
18880 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
18890 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
188a0 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ns that need to 
188b0 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70  be placed in a p
188c0 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
188d0 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c  er.  .** We coul
188e0 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75  d factor them ou
188f0 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77  t, but then we w
18900 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69  ould end up addi
18910 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70  ng an.** OP_SCop
18920 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  y instruction to
18930 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
18940 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
18950 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74   register.** lat
18960 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  er.  We might as
18970 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74   well just use t
18980 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74  he original inst
18990 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61  ruction and.** a
189a0 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70  void the OP_SCop
189b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
189c0 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
189d0 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20  rFactoring(Expr 
189e0 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69  *p){.  if( !sqli
189f0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
18a00 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20  tNotJoin(p) ){. 
18a10 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
18a20 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65   Only constant e
18a30 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61  xpressions are a
18a40 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66  ppropriate for f
18a50 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a  actoring */.  }.
18a60 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
18a70 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d  & EP_FixedDest)=
18a80 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
18a90 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73   1;  /* Any cons
18aa0 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66  tant without a f
18ab0 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
18ac0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
18ad0 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
18ae0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
18af0 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  ) p = p->pLeft;.
18b00 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
18b10 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
18b20 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
18b30 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
18b40 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20  BLOB:.#endif.   
18b50 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
18b60 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
18b70 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
18b80 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
18b90 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
18ba0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
18bb0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
18bc0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f  e( p->op==TK_BLO
18bd0 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  B );.      testc
18be0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56  ase( p->op==TK_V
18bf0 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20  ARIABLE );.     
18c00 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
18c10 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a  ==TK_INTEGER );.
18c20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18c30 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  p->op==TK_FLOAT 
18c40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18c50 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  e( p->op==TK_NUL
18c60 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
18c70 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  ase( p->op==TK_S
18c80 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f  TRING );.      /
18c90 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  * Single-instruc
18ca0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77  tion constants w
18cb0 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74  ith a fixed dest
18cc0 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ination are.    
18cd0 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65    ** better done
18ce0 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65   in-line.  If we
18cf0 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68   factor them, th
18d00 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64  ey will just end
18d10 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e  .      ** up gen
18d20 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43  erating an OP_SC
18d30 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  opy to move the 
18d40 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73  value to the des
18d50 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  tination.      *
18d60 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20  * register. */. 
18d70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18d80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
18d90 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
18da0 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f   if( p->pLeft->o
18db0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
18dc0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
18dd0 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
18de0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18df0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
18e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
18e10 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
18e20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
18e30 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
18e40 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
18e50 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
18e60 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
18e70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
18e80 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
18e90 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76   a loop, then ev
18ea0 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
18eb0 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20  ssion.** into a 
18ec0 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e  register and con
18ed0 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
18ee0 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45  ion into a TK_RE
18ef0 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73  GISTER.** expres
18f00 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
18f10 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70  int evalConstExp
18f20 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
18f30 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
18f40 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18f50 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
18f60 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  se;.  switch( pE
18f70 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
18f80 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63  ase TK_IN:.    c
18f90 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
18fa0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
18fb0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
18fc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
18fd0 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
18fe0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
18ff0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
19000 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  ST_FUNC: {.     
19010 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
19020 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  s to a function 
19030 68 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73  have a fixed des
19040 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  tination..      
19050 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69  ** Mark them thi
19060 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67  s way to avoid g
19070 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65  enerated unneede
19080 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20  d OP_SCopy.     
19090 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
190a0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
190b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
190c0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
190d0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
190e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
190f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
19100 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
19110 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
19120 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c        int i = pL
19130 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
19140 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19150 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
19160 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  = pList->a;.    
19170 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69      for(; i>0; i
19180 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
19190 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
191a0 59 53 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  YS(pItem->pExpr)
191b0 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d   ) pItem->pExpr-
191c0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78  >flags |= EP_Fix
191d0 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20  edDest;.        
191e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
191f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
19200 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72  .  if( isAppropr
19210 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
19220 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
19230 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65  nt r1 = ++pParse
19240 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20  ->nMem;.    int 
19250 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  r2;.    r2 = sql
19260 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
19270 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
19280 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e  , r1);.    if( N
19290 45 56 45 52 28 72 31 21 3d 72 32 29 20 29 20 73  EVER(r1!=r2) ) s
192a0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
192b0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
192c0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32  ;.    pExpr->op2
192d0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
192e0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
192f0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70  _REGISTER;.    p
19300 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72  Expr->iTable = r
19310 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  2;.    return WR
19320 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
19330 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
19340 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ue;.}../*.** Pre
19350 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e  evaluate constan
19360 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  t subexpressions
19370 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e   within pExpr an
19380 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
19390 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
193a0 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78  ers.  Modify pEx
193b0 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  pr so that the c
193c0 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
193d0 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f  sions.** are TK_
193e0 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73  REGISTER opcodes
193f0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
19400 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76  he precomputed v
19410 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  alues..*/.void s
19420 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
19430 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70  nstants(Parse *p
19440 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
19450 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
19460 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
19470 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78  ck = evalConstEx
19480 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  pr;.  w.xSelectC
19490 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
194a0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
194b0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
194c0 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
194d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
194e0 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
194f0 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
19500 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
19510 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
19520 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
19530 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
19540 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
19550 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
19560 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
19570 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
19580 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  ents evaluated..
19590 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
195a0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
195b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
195c0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
195d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
195e0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
195f0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
19600 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
19610 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
19620 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
19630 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
19640 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  ults */.  int do
19650 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20  HardCopy     /* 
19660 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79  Make a hard copy
19670 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
19680 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  t */.){.  struct
19690 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
196a0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
196b0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
196c0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
196d0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
196e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
196f0 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
19700 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
19710 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
19720 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
19730 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
19740 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
19750 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
19760 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
19770 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
19780 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52  xpr;.    int inR
19790 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
197a0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
197b0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
197c0 2b 69 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  +i);.    if( inR
197d0 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
197e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
197f0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
19800 70 56 64 62 65 2c 20 64 6f 48 61 72 64 43 6f 70  pVdbe, doHardCop
19810 79 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  y ? OP_Copy : OP
19820 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20  _SCopy,.        
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
19850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19860 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
19870 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
19880 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65  or a BETWEEN ope
19890 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rator..**.**    
198a0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
198b0 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  z.**.** The abov
198c0 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
198d0 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d  to .**.**    x>=
198e0 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a  y AND x<=z.**.**
198f0 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
19900 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
19910 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
19920 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
19930 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  elementation of 
19940 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
19950 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65  d exprCodeBetwee
19960 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
19970 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
19980 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
19990 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
199a0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
199b0 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57       /* The BETW
199c0 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  EEN expression *
199d0 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
199e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
199f0 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69  re if the jump i
19a00 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  s taken */.  int
19a10 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f   jumpIfTrue,   /
19a20 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
19a30 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
19a40 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
19a50 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
19a60 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
19a70 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
19a80 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78   NULL */.){.  Ex
19a90 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
19aa0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
19ab0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
19ac0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
19ad0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
19ae0 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
19af0 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
19b00 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
19b10 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
19b20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
19b30 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
19b40 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19b50 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
19b60 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
19b70 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
19b80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
19b90 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19ba0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
19bb0 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
19bc0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
19bd0 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
19be0 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
19bf0 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
19c00 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
19c10 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
19c20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
19c30 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
19c40 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
19c50 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
19c60 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
19c70 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
19c80 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
19c90 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
19ca0 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
19cb0 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
19cc0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
19cd0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
19ce0 45 78 70 72 3b 0a 20 20 65 78 70 72 58 2e 69 54  Expr;.  exprX.iT
19cf0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
19d00 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19d10 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
19d20 72 65 65 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f  ree1);.  exprX.o
19d30 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
19d40 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75  .  if( jumpIfTru
19d50 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
19d60 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
19d70 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
19d80 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
19d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
19da0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
19db0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
19dc0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19dd0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
19de0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19df0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
19e00 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
19e10 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
19e20 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
19e30 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
19e40 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
19e50 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
19e60 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
19e70 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
19e80 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
19e90 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
19ea0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
19eb0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
19ec0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
19ed0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
19ee0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
19ef0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
19f00 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
19f10 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
19f20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
19f30 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
19f40 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
19f50 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
19f60 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
19f70 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
19f80 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
19f90 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
19fa0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
19fb0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
19fc0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
19fd0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
19fe0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
19ff0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1a000 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1a010 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1a020 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1a030 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1a040 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1a050 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1a060 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1a070 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1a080 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
1a090 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1a0a0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1a0b0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1a0c0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1a0d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1a0e0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1a0f0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1a100 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1a110 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
1a120 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1a130 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
1a140 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
1a150 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
1a160 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
1a170 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
1a180 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
1a190 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
1a1a0 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
1a1b0 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
1a1c0 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
1a1d0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
1a1e0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1a1f0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
1a200 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
1a210 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
1a220 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
1a230 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
1a240 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
1a250 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
1a260 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
1a270 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
1a280 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
1a290 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
1a2a0 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
1a2b0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
1a2c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1a2d0 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
1a2e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1a2f0 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
1a300 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
1a310 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1a320 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
1a330 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1a340 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
1a350 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
1a360 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
1a370 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
1a380 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
1a390 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
1a3a0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
1a3b0 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
1a3c0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
1a3d0 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tance of VDBE ch
1a3e0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1a3f0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
1a400 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
1a410 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
1a420 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
1a430 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
1a440 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
1a450 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1a460 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
1a470 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1a480 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1a4a0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1a4b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a4c0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1a4d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a4e0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1a4f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1a500 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
1a510 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1a520 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1a530 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1a540 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1a550 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1a560 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1a570 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a580 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1a590 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a5a0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1a5b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a5c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a5d0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
1a5e0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1a5f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1a600 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1a610 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a620 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1a630 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1a640 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1a650 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a660 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1a670 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1a680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a690 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1a6a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a6b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1a6c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a6d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1a6e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1a6f0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1a700 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1a710 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a720 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1a730 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1a740 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1a750 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1a760 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1a770 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
1a780 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
1a790 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
1a7a0 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
1a7b0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1a7c0 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
1a7d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a7e0 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
1a7f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1a800 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
1a810 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a820 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
1a830 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1a840 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
1a850 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1a860 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
1a870 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54  tcase( op==TK_GT
1a880 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a890 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  se( op==TK_GE );
1a8a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a8b0 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20   op==TK_EQ );.  
1a8c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1a8d0 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
1a8e0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1a8f0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1a900 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1a910 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1a920 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1a930 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1a940 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1a950 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1a960 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1a970 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1a980 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1a990 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a9a0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1a9b0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1a9d0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
1a9e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  Null);.      tes
1a9f0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1aa00 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1aa10 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1aa20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1aa30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1aa40 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1aa50 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
1aa60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1aa70 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
1aa80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1aa90 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1aaa0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1aab0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1aac0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1aad0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1aae0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1aaf0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ab00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ab10 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1ab20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1ab30 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1ab40 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
1ab50 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1ab60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1ab70 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab90 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1aba0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
1abb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1abc0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1abd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1abe0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1abf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ac00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1ac10 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1ac20 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1ac30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1ac40 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1ac50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ac60 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1ac70 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
1ac80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ac90 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1aca0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1acb0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1acc0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1acd0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ace0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1acf0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ad00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ad10 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1ad20 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
1ad30 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1ad40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1ad50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ad60 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1ad70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ad80 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1ad90 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
1ada0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
1adb0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20  pExpr, dest, 1, 
1adc0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1add0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ade0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1adf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
1ae00 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
1ae10 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ae20 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
1ae30 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
1ae40 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
1ae50 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
1ae60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ae70 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1ae80 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
1ae90 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1aea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aeb0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1aec0 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
1aed0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1aee0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1aef0 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62  fFalse);.      b
1af00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1af10 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1af20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1af30 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1af40 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
1af50 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1af60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1af70 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
1af80 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1af90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1afa0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1afb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1afc0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1afd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1afe0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1aff0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b000 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1b010 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1b020 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b030 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
1b040 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b050 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1b060 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1b070 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1b080 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1b090 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1b0a0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1b0b0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
1b0c0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1b0d0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1b0e0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1b0f0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
1b100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1b110 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1b120 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1b130 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1b140 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
1b150 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
1b160 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1b170 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
1b180 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
1b190 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
1b1a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1b1b0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
1b1c0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1b1d0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1b1e0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1b1f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1b200 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1b210 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1b220 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1b230 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1b240 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1b250 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1b260 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1b270 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1b280 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1b290 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
1b2a0 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20  n; /* Existance 
1b2b0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1b2c0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1b2d0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
1b2e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
1b2f0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
1b300 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
1b310 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
1b320 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1b330 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
1b340 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
1b350 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
1b360 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
1b370 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
1b380 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
1b390 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
1b3a0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
1b3b0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
1b3c0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
1b3d0 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
1b3e0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
1b3f0 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
1b400 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
1b410 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1b430 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
1b440 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
1b450 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
1b460 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
1b470 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
1b480 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
1b490 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
1b4a0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
1b4b0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
1b4c0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
1b4d0 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
1b4e0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
1b4f0 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
1b500 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
1b510 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
1b520 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
1b530 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
1b540 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
1b550 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
1b560 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
1b570 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
1b580 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
1b590 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
1b5a0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
1b5b0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
1b5c0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
1b5d0 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
1b5e0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
1b5f0 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
1b600 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1b610 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1b620 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
1b630 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
1b640 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
1b650 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1b660 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
1b670 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1b680 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1b690 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
1b6a0 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
1b6b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1b6c0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
1b6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1b6e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
1b6f0 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
1b700 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b710 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
1b720 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
1b730 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1b740 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
1b750 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1b760 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
1b770 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
1b780 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1b790 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1b7a0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1b7b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1b7c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1b7d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1b7e0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1b7f0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1b800 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1b810 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1b820 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1b830 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1b840 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1b850 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b860 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1b870 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
1b880 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1b890 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b8a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1b8b0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1b8c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b8d0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1b8e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b8f0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1b900 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1b910 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
1b920 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1b930 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1b940 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1b950 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1b960 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1b970 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1b980 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b990 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1b9a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b9b0 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1b9c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b9d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b9e0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
1b9f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1ba00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1ba10 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1ba20 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ba30 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1ba40 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1ba50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ba60 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1ba70 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1ba80 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1ba90 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1baa0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1bab0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1bac0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bad0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1bae0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1baf0 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1bb00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1bb10 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1bb20 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1bb30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bb40 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1bb50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bb60 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1bb70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1bb80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1bb90 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1bba0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1bbb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1bbc0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1bbd0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1bbe0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1bbf0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1bc00 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1bc10 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1bc20 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1bc30 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1bc40 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1bc60 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1bc70 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1bc80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1bc90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1bca0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1bcb0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1bcc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1bcd0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1bce0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1bcf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bd00 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1bd10 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bd20 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1bd30 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1bd40 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1bd50 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1bd60 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1bd70 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1bd80 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1bd90 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1bda0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1bdb0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1bdc0 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1bdd0 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1bde0 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1bdf0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1be00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1be10 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1be20 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1be30 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1be40 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1be50 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1be60 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1be70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1be80 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1be90 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1bea0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1beb0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1bec0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1bed0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1bee0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1bef0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
1bf00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1bf10 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
1bf20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1bf30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1bf40 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1bf50 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1bf60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bf70 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
1bf80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bf90 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1bfa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bfb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bfc0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1bfd0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1bfe0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1bff0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1c000 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1c010 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
1c020 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1c030 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c040 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1c050 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c    if( jumpIfNull
1c060 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c070 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1c080 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1c090 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
1c0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1c0b0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
1c0c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c0d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
1c0e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c0f0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1c100 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75  , dest, destIfNu
1c110 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
1c120 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1c130 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
1c140 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
1c150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c160 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1c170 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1c180 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c190 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
1c1a0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1c1b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c1c0 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
1c1d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1c1e0 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65  ll!=0);.      te
1c1f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1c200 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1c210 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1c220 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  l==0 );.      br
1c230 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1c240 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c250 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c260 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1c270 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1c280 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1c290 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  e2);.}../*.** Do
1c2a0 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
1c2b0 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
1c2c0 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
1c2d0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
1c2e0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1c2f0 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
1c300 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
1c310 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
1c320 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
1c330 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1c340 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
1c350 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
1c360 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1c370 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
1c380 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
1c390 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
1c3a0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  or..**.** Someti
1c3b0 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
1c3c0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
1c3d0 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
1c3e0 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
1c3f0 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
1c400 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
1c410 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
1c420 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
1c430 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
1c440 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
1c450 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
1c460 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
1c470 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
1c480 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
1c490 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
1c4a0 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
1c4b0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
1c4c0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
1c4d0 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
1c4e0 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
1c4f0 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
1c500 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
1c510 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
1c520 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
1c530 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
1c540 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1c550 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
1c560 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
1c570 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
1c580 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
1c590 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
1c5a0 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
1c5b0 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
1c5c0 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
1c5d0 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
1c5e0 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
1c5f0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1c600 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
1c610 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
1c620 29 7b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c  ){.  if( pA==0||
1c630 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
1c640 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
1c650 20 32 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   2;.  }.  assert
1c660 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
1c670 70 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b  perty(pA, EP_Tok
1c680 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
1c690 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
1c6a0 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
1c6b0 72 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e  rty(pB, EP_Token
1c6c0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
1c6d0 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   );.  if( ExprHa
1c6e0 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  sProperty(pA, EP
1c6f0 5f 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45  _xIsSelect) || E
1c700 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c710 42 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  B, EP_xIsSelect)
1c720 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32   ){.    return 2
1c730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  ;.  }.  if( (pA-
1c740 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
1c750 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
1c760 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
1c770 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1c780 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
1c790 70 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  p ) return 2;.  
1c7a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1c7b0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
1c7c0 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
1c7d0 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
1c7e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1c7f0 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
1c800 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75  ->pRight) ) retu
1c810 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 2;.  if( sqli
1c820 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
1c830 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
1c840 70 42 2d 3e 78 2e 70 4c 69 73 74 29 20 29 20 72  pB->x.pList) ) r
1c850 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70  eturn 2;.  if( p
1c860 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
1c870 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
1c880 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
1c890 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  n ) return 2;.  
1c8a0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c8b0 72 74 79 28 70 41 2c 20 45 50 5f 49 6e 74 56 61  rty(pA, EP_IntVa
1c8c0 6c 75 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  lue) ){.    if( 
1c8d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1c8e0 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pB, EP_IntValue
1c8f0 29 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75  ) || pA->u.iValu
1c900 65 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e!=pB->u.iValue 
1c910 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c920 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
1c930 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
1c940 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
1c950 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
1c960 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1c970 79 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75  y(pB, EP_IntValu
1c980 65 29 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  e) || NEVER(pB->
1c990 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72  u.zToken==0) ) r
1c9a0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
1c9b0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1c9c0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
1c9d0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
1c9e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
1c9f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1ca00 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1ca10 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 28 70  _ExpCollate)!=(p
1ca20 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  B->flags & EP_Ex
1ca30 70 43 6f 6c 6c 61 74 65 29 20 29 20 72 65 74 75  pCollate) ) retu
1ca40 72 6e 20 31 3b 0a 20 20 69 66 28 20 28 70 41 2d  rn 1;.  if( (pA-
1ca50 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1ca60 6f 6c 6c 61 74 65 29 21 3d 30 20 26 26 20 70 41  ollate)!=0 && pA
1ca70 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d 3e 70 43 6f  ->pColl!=pB->pCo
1ca80 6c 6c 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ll ) return 2;. 
1ca90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1caa0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1cab0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
1cac0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1cad0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
1cae0 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
1caf0 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
1cb00 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
1cb10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cb20 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f   might return no
1cb30 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76  n-zero for equiv
1cb40 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e  alent ExprLists.
1cb50 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f    The.** only co
1cb60 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62  nsequence will b
1cb70 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d  e disabled optim
1cb80 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  izations.  But t
1cb90 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
1cba0 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ust never return
1cbb0 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78   0 if the two Ex
1cbc0 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61  prList objects a
1cbd0 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72  re different, or
1cbe0 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f  .** a malfunctio
1cbf0 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a  n will result..*
1cc00 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f  *.** Two NULL po
1cc10 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69  inters are consi
1cc20 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20  dered to be the 
1cc30 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c  same.  But a NUL
1cc40 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77  L pointer.** alw
1cc50 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ays differs from
1cc60 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e   a non-NULL poin
1cc70 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1cc80 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
1cc90 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c  re(ExprList *pA,
1cca0 20 45 78 70 72 4c 69 73 74 20 2a 70 42 29 7b 0a   ExprList *pB){.
1ccb0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1ccc0 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
1ccd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1cce0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
1ccf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1cd00 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
1cd10 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
1cd20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1cd30 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
1cd40 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
1cd50 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
1cd60 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
1cd70 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
1cd80 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
1cd90 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1cda0 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
1cdb0 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
1cdc0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1cdd0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
1cde0 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
1cdf0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
1ce00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1ce10 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
1ce20 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
1ce30 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
1ce40 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1ce50 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
1ce60 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
1ce70 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
1ce80 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
1ce90 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
1cea0 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
1ceb0 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
1cec0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
1ced0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
1cee0 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
1cef0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1cf00 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
1cf10 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
1cf20 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
1cf30 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
1cf40 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20         3,.      
1cf50 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
1cf60 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1cf70 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20  >nColumnAlloc,. 
1cf80 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1cf90 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
1cfa0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1cfb0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1cfc0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1cfd0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
1cfe0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
1cff0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
1d000 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
1d010 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
1d020 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
1d030 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
1d040 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
1d050 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
1d060 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
1d070 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
1d080 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1d090 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
1d0a0 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
1d0b0 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
1d0c0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
1d0d0 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
1d0e0 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  3,.       &pInfo
1d0f0 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
1d100 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c  &pInfo->nFuncAll
1d110 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
1d120 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
1d130 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
1d140 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
1d150 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
1d160 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
1d170 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
1d180 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
1d190 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1d1a0 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
1d1b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1d1c0 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
1d1d0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1d1e0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1d1f0 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
1d200 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
1d210 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
1d220 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
1d230 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
1d240 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
1d250 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
1d260 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
1d270 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1d280 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
1d290 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
1d2a0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
1d2b0 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
1d2c0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1d2d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1d2e0 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
1d2f0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1d300 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d310 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
1d320 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
1d330 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1d340 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1d350 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
1d360 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1d370 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
1d380 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
1d390 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
1d3a0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
1d3b0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
1d3c0 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
1d3d0 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
1d3e0 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
1d3f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d400 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
1d410 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
1d420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
1d430 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
1d440 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1d450 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1d460 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
1d470 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d480 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
1d490 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d4a0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1d4b0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
1d4c0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
1d4d0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
1d4e0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
1d4f0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
1d500 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
1d510 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
1d520 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
1d530 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
1d540 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
1d550 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d560 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1d570 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
1d580 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1d590 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
1d5a0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
1d5b0 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
1d5c0 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
1d5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1d5e0 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
1d5f0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1d600 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1d610 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
1d620 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1d630 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
1d640 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
1d650 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
1d660 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
1d670 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
1d680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1d690 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
1d6a0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d6c0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
1d6d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1d700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d720 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
1d730 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
1d740 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
1d750 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
1d760 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
1d770 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
1d780 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1d790 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
1d7a0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1d7b0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
1d7c0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
1d7d0 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
1d7e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1d7f0 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
1d800 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
1d810 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
1d820 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
1d830 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
1d840 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
1d850 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1d860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d870 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1d880 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1d890 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
1d8a0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1d8b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1d8c0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1d8d0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
1d8e0 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1d900 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
1d910 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1d920 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
1d930 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1d940 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
1d950 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
1d960 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
1d970 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1d980 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1d990 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
1d9a0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1d9b0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1d9c0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1d9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d9e0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1d9f0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
1da00 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
1da10 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1da30 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
1da40 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1da70 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1da90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1daa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1dae0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1daf0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
1db00 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1db10 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
1db20 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
1db30 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
1db40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1db50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1db60 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1db70 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
1db80 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
1db90 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
1dba0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
1dbb0 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
1dbc0 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
1dbd0 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
1dbe0 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
1dbf0 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
1dc00 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
1dc10 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
1dc20 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
1dc30 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1dc40 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
1dc50 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
1dc60 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1dc70 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49          ExprSetI
1dc80 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72  rreducible(pExpr
1dc90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1dca0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
1dcb0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
1dcc0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1dcd0 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
1dce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1dcf0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
1dd00 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
1dd10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1dd20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
1dd30 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
1dd40 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
1dd50 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
1dd60 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
1dd70 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1dd80 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1dd90 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
1dda0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1ddb0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ON: {.      /* T
1ddc0 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  he pNC->nDepth==
1ddd0 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67  0 test causes ag
1dde0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1ddf0 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a  s in subqueries.
1de00 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
1de10 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
1de20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
1de30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1de40 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1de50 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
1de60 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
1de70 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
1de80 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
1de90 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
1dea0 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
1deb0 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
1dec0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
1ded0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1dee0 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
1def0 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
1df00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
1df10 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1df20 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1df30 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1df40 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1df50 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
1df60 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pr)==0 ){.      
1df70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1df80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1dfa0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
1dfb0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
1dfc0 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
1dfd0 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
1dfe0 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
1dff0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
1e000 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e010 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
1e020 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
1e030 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
1e040 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
1e050 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
1e060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e070 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1e080 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e090 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e0a0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1e0b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1e0c0 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
1e0d0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
1e0e0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1e0f0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
1e100 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
1e110 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
1e120 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
1e130 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e140 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e150 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1e160 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
1e170 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
1e180 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
1e190 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
1e1c0 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  en, sqlite3Strle
1e1d0 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  n30(pExpr->u.zTo
1e1e0 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ken),.          
1e1f0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1e200 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
1e210 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
1e220 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
1e230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
1e240 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1e250 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
1e260 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1e270 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
1e280 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1e290 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1e2b0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
1e2c0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
1e2d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1e2e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e2f0 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
1e300 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
1e310 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
1e320 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
1e330 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e340 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e350 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1e360 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1e370 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
1e380 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
1e390 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
1e3a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1e3b0 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
1e3c0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
1e3d0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
1e3e0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
1e3f0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1e400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e410 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
1e420 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
1e430 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
1e440 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
1e450 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1e460 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
1e470 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  t){.  NameContex
1e480 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
1e490 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70  ->u.pNC;.  if( p
1e4a0 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
1e4b0 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
1e4c0 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ++;.    sqlite3W
1e4d0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1e4e0 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  r, pSelect);.   
1e4f0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a   pNC->nDepth--;.
1e500 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1e510 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rune;.  }else{. 
1e520 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
1e530 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ntinue;.  }.}../
1e540 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
1e550 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1e560 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
1e570 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1e580 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
1e590 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
1e5a0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
1e5b0 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
1e5c0 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
1e5d0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
1e5e0 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
1e5f0 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
1e600 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1e610 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e620 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
1e630 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
1e640 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
1e650 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
1e660 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
1e670 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
1e680 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1e690 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1e6a0 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
1e6b0 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
1e6c0 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
1e6d0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1e6e0 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
1e6f0 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
1e700 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
1e710 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
1e720 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e  Select;.  w.u.pN
1e730 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72  C = pNC;.  asser
1e740 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
1e750 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1e760 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
1e770 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  pr);.}../*.** Ca
1e780 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
1e790 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1e7a0 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
1e7b0 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
1e7c0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1e7d0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
1e7e0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
1e7f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1e800 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
1e810 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
1e820 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
1e830 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1e840 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
1e850 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
1e860 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
1e870 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1e880 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1e890 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
1e8a0 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
1e8b0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1e8c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1e8d0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1e8e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e8f0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1e900 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
1e910 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
1e920 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1e930 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72  e a single new r
1e940 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20  egister for use 
1e950 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74  to hold some int
1e960 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
1e970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e980 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
1e990 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
1e9a0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1e9b0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
1e9c0 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
1e9d0 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
1e9e0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1e9f0 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
1ea00 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Reg];.}../*.** D
1ea10 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69  eallocate a regi
1ea20 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61  ster, making ava
1ea30 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
1ea40 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a   for some other.
1ea50 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a  ** purpose..**.*
1ea60 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
1ea70 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  is currently bei
1ea80 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ng used by the c
1ea90 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65  olumn cache, the
1eaa0 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61  n.** the dalloca
1eab0 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64  tion is deferred
1eac0 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d   until the colum
1ead0 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61  n cache line tha
1eae0 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65  t uses.** the re
1eaf0 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73  gister becomes s
1eb00 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tale..*/.void sq
1eb10 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1eb20 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
1eb30 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
1eb40 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
1eb50 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1eb60 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1eb70 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
1eb80 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
1eb90 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1eba0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
1ebb0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1ebc0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1ebd0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1ebe0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
1ebf0 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
1ec00 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
1ec10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
1ec20 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
1ec30 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
1ec40 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
1ec50 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52  nTempReg++] = iR
1ec60 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
1ec70 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61   Allocate or dea
1ec80 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20  llocate a block 
1ec90 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74  of nReg consecut
1eca0 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f  ive registers.*/
1ecb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
1ecc0 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
1ecd0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
1ece0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
1ecf0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
1ed00 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
1ed10 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
1ed20 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
1ed30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75  {.    assert( !u
1ed40 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1ed50 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
1ed60 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  1) );.    pParse
1ed70 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
1ed80 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
1ed90 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
1eda0 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
1edb0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
1edc0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
1edd0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
1ede0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
1edf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
1ee00 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
1ee10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ee20 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
1ee30 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
1ee40 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1ee50 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a  e, iReg, nReg);.
1ee60 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
1ee70 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
1ee80 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
1ee90 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
1eea0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
1eeb0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
1eec0 7d 0a                                            }.